#!/usr/bin/perl #Copyright 2008 Arthur S Goldstein use Test::More tests => 35; package traveller; #only to Urbana %roads = ( 'Minneapolis' => ['St. Paul', 'Duluth'], 'St. Paul' => ['Minneapolis', 'Madison'], 'Madison' => ['Rockford', 'St. Paul', 'Chicago'], 'Rockford' => ['Bloomington', 'Madison'], 'Bloomington' => ['Champaign'], 'Champaign' => ['Urbana', 'Chicago'], 'Chicago' => ['Minneapolis', 'Urbana'], 'Urbana' => [], 'Duluth' => ['Chicago'], ); %distance_to_urbana = ( 'Minneapolis' => 515, 'St. Paul' => 505, 'Madison' => 252, 'Rockford' => 185, 'Bloomington' => 56, 'Champaign' => 2, 'Chicago' => 140, 'Urbana' => 0, 'Duluth' => 575, ); sub distance_to_urbana { my $self = shift; return $distance_to_urbana{$self->{position}}; } sub new {return bless {}} sub next_moves {my $self = shift; return @{$roads{$self->{position}}}} sub move {my $self = shift; $self->{position} = shift; return $distance_to_urbana{$self->{position}};} sub value {my $self = shift; return $self->{position}} sub copy {my $self = shift; my $copy = $self->new; $copy->move($self->{position}); return $copy;}; sub is_solution {my $self = shift; return $self->{position} eq 'Urbana';} package main; use Algorithm::Search; my $driver = new traveller; my $travel_search = new Algorithm::Search(); $driver->move('Minneapolis'); #start out in Minneapolis $travel_search->search({search_this => $driver, solutions_to_find => 0, }); my $full_path; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "Duluth..Chicago..Urbana St. Paul..Madison..Rockford..Bloomington..Champaign..Urbana St. Paul..Madison..Rockford..Bloomington..Champaign..Chicago..Urbana St. Paul..Madison..Chicago..Urbana ", 'ts2 minneapolis to urbana paths'); $travel_search->search({search_this => $driver, solutions_to_find => 2 }); #print "sf \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "Duluth..Chicago..Urbana St. Paul..Madison..Rockford..Bloomington..Champaign..Urbana ", 'ts2 limit 2'); $travel_search->search({search_this => $driver, solutions_to_find => 0, maximum_depth => 5 }); #print "md \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "Duluth..Chicago..Urbana St. Paul..Madison..Chicago..Urbana ", 'ts2 max depth dfs'); $travel_search->search({search_this => $driver, solutions_to_find => 0, do_not_repeat_values => 1 }); #print "dnr \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "Duluth..Chicago..Urbana ", 'ts2 dfs no repeat values'); $driver->move('Duluth'); #start out in Duluth $travel_search->search({search_this => $driver, solutions_to_find => 0, }); $full_path = ''; if ($travel_search->solution_found) { #should be false, no path to Urbana $full_path = 'x'; #print "found path from Duluth to Urbana\n"; } is ($full_path, 'x', 'ts2 from duluth dfs'); $driver->move('Minneapolis'); #start out in Minneapolis $travel_search->search({search_this => $driver, solutions_to_find => 0, cost_cannot_increase => 1, initial_cost => $driver->distance_to_urbana, }); $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "St. Paul..Madison..Rockford..Bloomington..Champaign..Urbana St. Paul..Madison..Chicago..Urbana ", 'ts2 nd minneapolis to urbana paths'); $travel_search->search({search_this => $driver, solutions_to_find => 2, cost_cannot_increase => 1, initial_cost => $driver->distance_to_urbana, }); #print "sf \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "St. Paul..Madison..Rockford..Bloomington..Champaign..Urbana St. Paul..Madison..Chicago..Urbana ", 'ts2 d limit 2'); $travel_search->search({search_this => $driver, solutions_to_find => 0, maximum_depth => 5, cost_cannot_increase => 1, initial_cost => $driver->distance_to_urbana, }); #print "md \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "St. Paul..Madison..Chicago..Urbana ", 'ts2 xnd max depth dfs'); $travel_search->search({search_this => $driver, solutions_to_find => 0, do_not_repeat_values => 1, cost_cannot_increase => 1, initial_cost => $driver->distance_to_urbana, }); #print "dnr \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "St. Paul..Madison..Rockford..Bloomington..Champaign..Urbana ", 'ts2 nd dfs no repeat values'); $driver->move('Duluth'); #start out in Duluth $travel_search->search({search_this => $driver, solutions_to_find => 0, cost_cannot_increase => 1, initial_cost => $driver->distance_to_urbana, }); $full_path = ''; if ($travel_search->solution_found) { #should be false, no path to Urbana $full_path = 'x'; #print "found path from Duluth to Urbana\n"; } is ($full_path, 'x', 'ts2 nd from duluth dfs'); $driver->move('Minneapolis'); #start out in Minneapolis $travel_search->search({search_this => $driver, solutions_to_find => 0, maximum_depth => 8, no_value_function => 1, }); #print "md \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "Duluth..Chicago..Minneapolis..St. Paul..Madison..Chicago..Urbana Duluth..Chicago..Minneapolis..Duluth..Chicago..Urbana Duluth..Chicago..Urbana St. Paul..Minneapolis..St. Paul..Minneapolis..Duluth..Chicago..Urbana St. Paul..Minneapolis..St. Paul..Madison..Chicago..Urbana St. Paul..Minneapolis..Duluth..Chicago..Urbana St. Paul..Madison..Rockford..Bloomington..Champaign..Urbana St. Paul..Madison..Rockford..Bloomington..Champaign..Chicago..Urbana St. Paul..Madison..Rockford..Madison..Chicago..Urbana St. Paul..Madison..St. Paul..Minneapolis..Duluth..Chicago..Urbana St. Paul..Madison..St. Paul..Madison..Chicago..Urbana St. Paul..Madison..Chicago..Minneapolis..Duluth..Chicago..Urbana St. Paul..Madison..Chicago..Urbana ", 'ts2 nd dfs distance can increase, no value function'); # as bfs $driver->move('Minneapolis'); #start out in Minneapolis $travel_search->search({search_this => $driver, solutions_to_find => 0, search_type => 'bfs', }); $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "Duluth..Chicago..Urbana St. Paul..Madison..Chicago..Urbana St. Paul..Madison..Rockford..Bloomington..Champaign..Urbana St. Paul..Madison..Rockford..Bloomington..Champaign..Chicago..Urbana ", 'ts2 bfs minneapolis to urbana paths'); $travel_search->search({search_this => $driver, search_type => 'bfs', solutions_to_find => 2 }); #print "sf \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "Duluth..Chicago..Urbana St. Paul..Madison..Chicago..Urbana ", 'ts2 bfs limit 2'); $travel_search->search({search_this => $driver, solutions_to_find => 0, search_type => 'bfs', maximum_depth => 5 }); #print "md \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "Duluth..Chicago..Urbana St. Paul..Madison..Chicago..Urbana ", 'ts2 bfs max depth'); $travel_search->search({search_this => $driver, solutions_to_find => 0, search_type => 'bfs', do_not_repeat_values => 1 }); #print "dnr \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "Duluth..Chicago..Urbana ", 'ts2 bfs no repeat values'); $driver->move('Duluth'); #start out in Duluth $travel_search->search({search_this => $driver, solutions_to_find => 0, search_type => 'bfs', }); $full_path = ''; if ($travel_search->solution_found) { #should be false, no path to Urbana $full_path = 'x'; #print "found path from Duluth to Urbana\n"; } is ($full_path, 'x', 'ts2 from duluth bfs'); $driver->move('Minneapolis'); #start out in Minneapolis $travel_search->search({search_this => $driver, solutions_to_find => 0, search_type => 'bfs', cost_cannot_increase => 1, initial_cost => $driver->distance_to_urbana, }); $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "St. Paul..Madison..Chicago..Urbana St. Paul..Madison..Rockford..Bloomington..Champaign..Urbana ", 'ts2 bfs nd minneapolis to urbana paths'); $travel_search->search({search_this => $driver, search_type => 'bfs', solutions_to_find => 2, cost_cannot_increase => 1, initial_cost => $driver->distance_to_urbana, }); #print "sf \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "St. Paul..Madison..Chicago..Urbana St. Paul..Madison..Rockford..Bloomington..Champaign..Urbana ", 'ts2 bfs nd limit 2'); $travel_search->search({search_this => $driver, solutions_to_find => 0, search_type => 'bfs', maximum_depth => 5, cost_cannot_increase => 1, initial_cost => $driver->distance_to_urbana, }); #print "md \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "St. Paul..Madison..Chicago..Urbana ", 'ts2 nd max depth bfs'); $travel_search->search({search_this => $driver, solutions_to_find => 0, search_type => 'bfs', do_not_repeat_values => 1, cost_cannot_increase => 1, initial_cost => $driver->distance_to_urbana, }); #print "dnr \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "St. Paul..Madison..Chicago..Urbana ", 'ts2 nd bfs no repeat values'); $driver->move('Duluth'); #start out in Duluth $travel_search->search({search_this => $driver, solutions_to_find => 0, search_type => 'bfs', }); $full_path = ''; if ($travel_search->solution_found) { #should be false, no path to Urbana $full_path = 'x'; #print "found path from Duluth to Urbana\n"; } is ($full_path, 'x', 'ts2 nd from duluth bfs'); $driver->move('Minneapolis'); #start out in Minneapolis $travel_search->search({search_this => $driver, search_type => 'bfs', maximum_depth => 8, no_value_function => 1, solutions_to_find => 0, }); #print "md \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "Duluth..Chicago..Urbana St. Paul..Madison..Chicago..Urbana St. Paul..Minneapolis..Duluth..Chicago..Urbana Duluth..Chicago..Minneapolis..Duluth..Chicago..Urbana St. Paul..Minneapolis..St. Paul..Madison..Chicago..Urbana St. Paul..Madison..Rockford..Bloomington..Champaign..Urbana St. Paul..Madison..Rockford..Madison..Chicago..Urbana St. Paul..Madison..St. Paul..Madison..Chicago..Urbana Duluth..Chicago..Minneapolis..St. Paul..Madison..Chicago..Urbana St. Paul..Minneapolis..St. Paul..Minneapolis..Duluth..Chicago..Urbana St. Paul..Madison..Rockford..Bloomington..Champaign..Chicago..Urbana St. Paul..Madison..St. Paul..Minneapolis..Duluth..Chicago..Urbana St. Paul..Madison..Chicago..Minneapolis..Duluth..Chicago..Urbana ", 'ts2 nd bfs distance can increase, no value function'); # as cost $travel_search->search({search_this => $driver, solutions_to_find => 0, search_type => 'cost', initial_cost => $driver->distance_to_urbana, maximum_depth => 8, }); $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "St. Paul..Madison..Rockford..Bloomington..Champaign..Urbana St. Paul..Madison..Rockford..Bloomington..Champaign..Chicago..Urbana St. Paul..Madison..Chicago..Urbana Duluth..Chicago..Urbana ", 'ts2 nd cost distance can increase, max depth'); $driver->move('Minneapolis'); #start out in Minneapolis $travel_search->search({search_this => $driver, solutions_to_find => 0, search_type => 'cost', initial_cost => $driver->distance_to_urbana, }); $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "St. Paul..Madison..Rockford..Bloomington..Champaign..Urbana St. Paul..Madison..Rockford..Bloomington..Champaign..Chicago..Urbana St. Paul..Madison..Chicago..Urbana Duluth..Chicago..Urbana ", 'ts2 cost minneapolis to urbana paths'); $travel_search->search({search_this => $driver, search_type => 'cost', initial_cost => $driver->distance_to_urbana, solutions_to_find => 2, }); #print "sf \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "St. Paul..Madison..Rockford..Bloomington..Champaign..Urbana St. Paul..Madison..Rockford..Bloomington..Champaign..Chicago..Urbana ", 'ts2 cost limit 2'); $travel_search->search({search_this => $driver, solutions_to_find => 0, search_type => 'cost', initial_cost => $driver->distance_to_urbana, maximum_depth => 5, return_search_trace => 1, }); #print "md \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "St. Paul..Madison..Chicago..Urbana Duluth..Chicago..Urbana ", 'ts2 cost max depth'); #use Data::Dumper; #print STDERR "q: ".Dumper($travel_search->search_trace)."\n"; is_deeply($travel_search->search_trace, [ { 'commit' => undef, 'cost' => 515, 'move' => undef, 'value_before' => undef, 'value_after' => 'Minneapolis' }, { 'commit' => undef, 'cost' => 515, 'move' => 'Duluth', 'value_before' => 'Minneapolis', 'value_after' => 'Duluth' }, { 'commit' => undef, 'cost' => 515, 'move' => 'St. Paul', 'value_before' => 'Minneapolis', 'value_after' => 'St. Paul' }, { 'commit' => undef, 'cost' => 505, 'move' => 'Madison', 'value_before' => 'St. Paul', 'value_after' => 'Madison' }, { 'commit' => undef, 'cost' => 252, 'move' => 'Rockford', 'value_before' => 'Madison', 'value_after' => 'Rockford' }, { 'commit' => undef, 'cost' => 185, 'move' => 'Bloomington', 'value_before' => 'Rockford', 'value_after' => 'Bloomington' }, { 'commit' => undef, 'cost' => 252, 'move' => 'Chicago', 'value_before' => 'Madison', 'value_after' => 'Chicago' }, { 'commit' => undef, 'cost' => 140, 'move' => 'Urbana', 'value_before' => 'Chicago', 'value_after' => 'Urbana' }, { 'commit' => undef, 'cost' => 575, 'move' => 'Chicago', 'value_before' => 'Duluth', 'value_after' => 'Chicago' }, { 'commit' => undef, 'cost' => 140, 'move' => 'Urbana', 'value_before' => 'Chicago', 'value_after' => 'Urbana' } ], 'cost based max depth search trace'); $travel_search->search({search_this => $driver, solutions_to_find => 0, search_type => 'cost', initial_cost => $driver->distance_to_urbana, do_not_repeat_values => 1, }); #print "dnr \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "St. Paul..Madison..Rockford..Bloomington..Champaign..Urbana ", 'ts2 cost no repeat values'); $driver->move('Duluth'); #start out in Duluth $travel_search->search({search_this => $driver, solutions_to_find => 0, search_type => 'cost', initial_cost => $driver->distance_to_urbana, }); $full_path = ''; if ($travel_search->solution_found) { #should be false, no path to Urbana $full_path = 'x'; #print "found path from Duluth to Urbana\n"; } is ($full_path, 'x', 'ts2 from duluth cost'); $driver->move('Minneapolis'); #start out in Minneapolis $travel_search->search({search_this => $driver, solutions_to_find => 0, search_type => 'cost', cost_cannot_increase => 1, initial_cost => $driver->distance_to_urbana, }); $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "St. Paul..Madison..Rockford..Bloomington..Champaign..Urbana St. Paul..Madison..Chicago..Urbana ", 'ts2 cost nd minneapolis to urbana paths'); $travel_search->search({search_this => $driver, search_type => 'cost', solutions_to_find => 2, cost_cannot_increase => 1, initial_cost => $driver->distance_to_urbana, }); #print "sf \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "St. Paul..Madison..Rockford..Bloomington..Champaign..Urbana St. Paul..Madison..Chicago..Urbana ", 'ts2 cost nd limit 2'); $travel_search->search({search_this => $driver, search_type => 'cost', solutions_to_find => 0, maximum_depth => 5, cost_cannot_increase => 1, initial_cost => $driver->distance_to_urbana, }); #print "md \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "St. Paul..Madison..Chicago..Urbana ", 'ts2 nd max depth cost'); $travel_search->search({search_this => $driver, search_type => 'cost', initial_cost => $driver->distance_to_urbana, solutions_to_find => 0, do_not_repeat_values => 1 }); #print "dnr \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "St. Paul..Madison..Rockford..Bloomington..Champaign..Urbana ", 'ts2 nd cost no repeat values'); $driver->move('Duluth'); #start out in Duluth $travel_search->search({search_this => $driver, solutions_to_find => 0, search_type => 'cost', initial_cost => $driver->distance_to_urbana, }); $full_path = ''; if ($travel_search->solution_found) { #should be false, no path to Urbana $full_path = 'x'; #print "found path from Duluth to Urbana\n"; } is ($full_path, 'x', 'ts2 nd from duluth cost'); $driver->move('Minneapolis'); #start out in Minneapolis $travel_search->search({search_this => $driver, search_type => 'cost', maximum_depth => 8, no_value_function => 1, solutions_to_find => 0, initial_cost => $driver->distance_to_urbana, }); #print "md \n"; $full_path = ''; if ($travel_search->solution_found) { #should be true, path to Urbana #print "found path from Minneapolis to Urbana\n"; # print join("..", @{$travel_search->path})."\n"; my $path_count = 0; foreach my $path ($travel_search->paths) { # print "Path ".$path_count++." "; # print join("..", @{$path})."\n"; $full_path .= join("..", @{$path})."\n"; } } is ($full_path, "St. Paul..Madison..Rockford..Bloomington..Champaign..Urbana St. Paul..Madison..Rockford..Bloomington..Champaign..Chicago..Urbana St. Paul..Madison..Chicago..Urbana St. Paul..Madison..Rockford..Madison..Chicago..Urbana St. Paul..Madison..St. Paul..Madison..Chicago..Urbana St. Paul..Minneapolis..St. Paul..Madison..Chicago..Urbana Duluth..Chicago..Urbana Duluth..Chicago..Minneapolis..St. Paul..Madison..Chicago..Urbana St. Paul..Minneapolis..Duluth..Chicago..Urbana St. Paul..Madison..Chicago..Minneapolis..Duluth..Chicago..Urbana St. Paul..Madison..St. Paul..Minneapolis..Duluth..Chicago..Urbana St. Paul..Minneapolis..St. Paul..Minneapolis..Duluth..Chicago..Urbana Duluth..Chicago..Minneapolis..Duluth..Chicago..Urbana ", 'ts2 nd cost distance can increase, no value function');