Revision: 4189
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at November 3, 2007 15:39 by mertnuhoglu
Initial Code
--- do_experiments.m % Usage of heuristics in console: % [p,l,d]=shortest_path('d198.txt'); % [p2,l2,d2]=insertion_heuristics('d198.txt',@farthest_insertion); % [p2,l2,d2]=insertion_heuristics('d198.txt',@arbitrary_insertion); function results=do_experiments() data_files={'d198.txt';'d1291.txt';'rat575.txt'}; number_of_experiments=10; results=[]; for idx_data=1:length(data_files) for i=1:number_of_experiments data=char(data_files(idx_data)); [path,total_length(1),dist]=shortest_path(data); [path,total_length(2)]=opt2(path,dist); [path,total_length(3),dist]=insertion_heuristics(data,@farthest_insertion); [path,total_length(4)]=opt2(path,dist); [path,total_length(5),dist]=insertion_heuristics(data,@arbitrary_insertion); [path,total_length(6)]=opt2(path,dist); results(i+(idx_data-1)*number_of_experiments,:)=total_length; end end --- shortest_path.m % calculates shortest path using nearest neighborhood function [path,total_length,distances] = shortest_path(data_file,idx_initial_city) distances=distance(read_location_data(data_file)); n=length(distances); if nargin < 2 idx_initial_city=ceil(rand(1)*n); end path=[]; outside=(1:n); [path,outside]=add_to_path(path,outside,outside(idx_initial_city)); for i = 1:n-1 entering_city=nearest_neighbor(distances,path(end),outside); [path,outside]=add_to_path(path,outside,entering_city); end total_length=total_length_of_cycle(distances,path); function [path,outside] = add_to_path(path,outside,city) path(end+1)=city; outside(outside==city)=[]; --- distance.m function d = distance(a) n=length(a); d=zeros(n,n); for i = 1:n for j = i+1:n d(i,j)=norm(a(i,:)-a(j,:)); d(j,i)=d(i,j); end; end; --- read_location_data.m function positions = read_location_data(data_file) load(data_file); filename=regexp(data_file,'\w*(?=\.)','match'); positions=eval(filename{1}); --- nearest_neighbor.m function nearest_city = nearest_neighbor(distances,last_city,outside) min_distance = inf; for j=1:length(outside) neighbors_distance = distances(outside(j),last_city); if neighbors_distance < min_distance min_distance = neighbors_distance; nearest_city = outside(j); end end end --- total_length_of_cycle.m function total_length = total_length_of_cycle(distances,path) total_length = 0; for i = 1:length(path)-1 total_length = total_length + distances(path(i),path(i+1)); end total_length = total_length + distances(path(end),path(1)); --- insertion_heuristics.m % generic insertion algorithm function [path,total_length,distances] = insertion_heuristics(data_file,insertion_rule,idx_initial_city) distances=distance(read_location_data(data_file)); n=length(distances); if nargin < 3 idx_initial_city=ceil(rand(1)*n); end path=[]; outside=(1:n); [path,outside]=add_to_path(path,outside,outside(idx_initial_city),1); for i = 1:n-1 entering_city=insertion_rule(path,outside,distances); entry_position=find_entry_position(distances,entering_city,path); [path,outside]=add_to_path(path,outside,entering_city,entry_position); end total_length=total_length_of_cycle(distances,path); function [path,outside] = add_to_path(path,outside,entering_city,entry_position) old_path=path; outside(outside==entering_city)=[]; path(entry_position)=entering_city; for i=entry_position:length(old_path) path(i+1)=old_path(i); end function entry_position=find_entry_position(distances,entering_city,path) min_increase_in_length = inf; global path_length path_length = length(path); for i=1:path_length before = distances(path(i),path(r(i+1))); after = distances(entering_city,path(i))+distances(entering_city,path(r(i+1))); increase_in_length = after-before; if increase_in_length < min_increase_in_length min_increase_in_length = increase_in_length; entry_position = r(i+1); end end % if index is greater than the path length, turn the index for one round function result = r(index) global path_length if index > path_length result = index - path_length; else result = index; end --- farthest_insertion.m function entering_city=farthest_insertion(path,outside,distances) max_distance=0; for i=1:length(path) for j=1:length(outside) if distances(path(i),outside(j)) > max_distance max_distance=distances(path(i),outside(j)); entering_city=outside(j); end end end --- arbitrary_insertion.m function entering_city = arbitrary_insertion(path,outside,distances) entering_city=outside(ceil(rand(1)*length(outside))); --- opt2.m function [path,total_length] = opt2(path,distances) global n n = length(path); for i=1:n for j=1:n-3 if change_in_path_length(path,i,j,distances) < 0 path=change_path(path,i,j); end end end total_length = total_length_of_cycle(distances,path); function result = change_in_path_length(path,i,j,distances) before=distances(path(r(i)),path(r(i+1)))+distances(path(r(i+1+j)),path(r(i+2+j))); after=distances(path(r(i)),path(r(i+1+j)))+distances(path(r(i+1)),path(r(i+2+j))); result=after-before; function path = change_path(path,i,j) old_path=path; % exchange edge cities path(r(i+1))=old_path(r(i+1+j)); path(r(i+1+j))=old_path(r(i+1)); % change direction of intermediate path for k=1:j-1 path(r(i+1+k))=old_path(r(i+1+j-k)); end % if index is greater than the path length, turn index one round off function result = r(index) global n if index > n result = index - n; else result = index; end
Initial URL
Initial Description
Initial Title
Shortest path heuristics (nearest neighborhood, 2 opt, farthest and arbitrary insertion) for travelling salesman problem
Initial Tags
Initial Language
MatLab