% ??????í?ê±μ???éìè?μ???é? ?éé?襣?
clr = [1 0 0; 0 0 1; 0.67 0 1; 0 1 0; 1 0.5 0]; if salesmen > 5
clr = hsv(salesmen); end
% ?aê???DDò?′???·¨1y3ì
global_min = Inf; %3?ê??ˉ×??ì?·?? total_dist = zeros(1,pop_size); dist_history = zeros(1,num_iter);
tmp_pop_rte = zeros(8,n); %μ±?°μ??·??éè?? tmp_pop_brk = zeros(8,num_brks); %μ±?°μ???μ?éè?? new_pop_rte = zeros(pop_size,n); %?üD?μ??·??éè?? new_pop_brk = zeros(pop_size,num_brks);%?üD?μ???μ?éè?? if show_prog
pfig = figure('Name','MTSPF_GA | Current Best Solution','Numbertitle','off'); end
for iter = 1:num_iter
% ?à????ò?′úμ???èo êêó|?é??2¢×÷3??????£ for p = 1:pop_size d = 0;
p_rte = pop_rte(p,:); p_brk = pop_brk(p,:);
rng = [[1 p_brk+1];[p_brk n]]'; for s = 1:salesmen
d = d +dmat(1,p_rte(rng(s,1))); % ìí?ó?aê?μ??·??(μ???μ?μ??·3?) for k =
rng(s,1):rng(s,2)-1 %????éìè?′ó?eμ?μ???μ?′|£¨?′?÷×?μ???μ?£? d = d + dmat(p_rte(k),p_rte(k+1)); end
d = d + dmat(p_rte(rng(s,2)),1); % ìí?ó?áê?μ?μ??·?? dis(p,s)=d;
%d=d+myLength(dmat,p_rte(rng(s,1):rng(s,2)));%?éμ÷ó?oˉêy′|àí
end
total_dist(p) = d;
%distan(p)=max(dis(p,:));%????èy??è??Dμ?×?′ó?μ end
% ?ú??′ú??èo?D?òμ?×?o?μ??·?? [min_dist,index] = min(total_dist);
dist_history(iter) = min_dist; %+max(distan);
if min_dist < global_min global_min = min_dist;
opt_rte = pop_rte(index,:); %×?ó?μ?×??ì?·?? opt_brk = pop_brk(index,:); %×?ó?μ???μ?éè?? rng = [[1 opt_brk+1];[opt_brk n]]'; %éè????????μ?μ?·?·¨ end
% ò?′???·¨??×óμ?2ù×÷?ˉo?
rand_grouping = randperm(pop_size); for p = 8:8:pop_size
rtes = pop_rte(rand_grouping(p-7:p),:); brks = pop_brk(rand_grouping(p-7:p),:); dists = total_dist(rand_grouping(p-7:p)); [ignore,idx] = min(dists); best_of_8_rte = rtes(idx,:); best_of_8_brk = brks(idx,:);
rte_ins_pts = sort(ceil(n*rand(1,2))); I = rte_ins_pts(1); J = rte_ins_pts(2); for k = 1:8 % 2úéúD?μ?·?°?
tmp_pop_rte(k,:) = best_of_8_rte; tmp_pop_brk(k,:) = best_of_8_brk; switch k
case 2 % μ1??2ù×÷
tmp_pop_rte(k,I:J) = fliplr(tmp_pop_rte(k,I:J)); case 3 % ?¥??2ù×÷
tmp_pop_rte(k,[I J]) = tmp_pop_rte(k,[J I]); case 4 % ???ˉ??ò?2ù×÷
tmp_pop_rte(k,I:J) = tmp_pop_rte(k,[I+1:J I]); case 5 % ?üD???μ?
tmp_pop_brk(k,:) = randbreaks(); case 6 % μ1??2¢?üD???μ?
tmp_pop_rte(k,I:J) = fliplr(tmp_pop_rte(k,I:J)); tmp_pop_brk(k,:) = randbreaks(); case 7 % ?¥??2¢?üD???μ?
tmp_pop_rte(k,[I J]) = tmp_pop_rte(k,[J I]); tmp_pop_brk(k,:) = randbreaks(); case 8 % ?àòé2¢?üD???μ?
tmp_pop_rte(k,I:J) = tmp_pop_rte(k,[I+1:J I]); tmp_pop_brk(k,:) = randbreaks(); otherwise % 2???DD2ù×? end end
new_pop_rte(p-7:p,:) = tmp_pop_rte; new_pop_brk(p-7:p,:) = tmp_pop_brk; end
pop_rte = new_pop_rte; pop_brk = new_pop_brk; end
% ·μ???á1?2?·?
rng = [[1 opt_brk+1];[opt_brk n]]';
dis_e=zeros(1,salesmen); %éè??2¢??????????DDéìμ?×??ì?·?? for s = 1:salesmen
dis_e(s)=myLength(dmat,opt_rte(rng(s,1):rng(s,2))); end
if nargout
varargout{1} = opt_rte; varargout{2} = opt_brk; varargout{3} = min_dist; varargout{4} = dis_e; end
%×?3?μü′ú1y3ìμ?í?ê? plot(dist_history);
grid on;xlabel('μü′úμ?′úêy');ylabel('?ù×?μ??·????oí'); % ???ú2úéúò?ì×??μ? μ??ˉo? function breaks = randbreaks()
if min_tour == 1 % ò?????DDéìê±£???óD??μ?μ?éè?? tmp_brks = randperm(n-1);
breaks = sort(tmp_brks(1:num_brks)); else % ??????μ??áéù ?ò μ?×??ìμ???DD3¤?è num_adjust = find(rand < cum_prob,1)-1; spaces = ceil(num_brks*rand(1,num_adjust)); adjust = zeros(1,num_brks); for kk = 1:num_brks
adjust(kk) = sum(spaces == kk); end
breaks = min_tour*(1:num_brks) + cumsum(adjust); end end end
附录三
问题二的计算程序
clc clear close all
a=xlsread('d:\\juli.xls','b2:bb54'); [d,r]=floyd(a);
[x1,x2,x3,x4]= mtspf_ga2(d,4,14,100) %·μ???óμ?×?ó??a?£
%遗传算法m文件
function varargout =
mtspf_ga2(dmat,salesmen,min_tour,pop_size,num_iter,show_prog,show_res)
%dmat è?òaá?3?êD??μ?×??ì?·?????óí¨1yfloyed??·¨?óμ??á1??£ %salesmen ??DDéì??êy
%min_tour ??????DDéì×?éù·??êμ?3?êDêy %pop_size ??èo??ì?êy %num_iter μü′úμ?′úêy
%show_prog,show_res ??ê?μ?2?êyéè?¨
nargs = 7; %′|àíê?è?2?êy£?ó?à′???¨ò?D???è?μ?2?êy£? for k = nargin:nargs-1 switch k case 0
dmat = 10*rand(20,20); case 1
salesmen = 5; case 2
min_tour = 2; case 3
pop_size = 80; case 4
num_iter = 5e3; case 5
show_prog = 1; case 6
show_res = 1; otherwise end end
% ?ì2éê?è? ???ó [nr,nc] = size(dmat);
if nr ~= nc
error('Invalid XY or DMAT inputs!') end
n = nr - 1; % 3yè¥?eê?μ?3?êDoóê£óàμ?3?êDμ?êy
% ê?è?2?êyμ??ì2é
salesmen = max(1,min(n,round(real(salesmen(1)))));
pop_size = max(8,8*ceil(pop_size(1)/8)); num_iter = max(1,round(real(num_iter(1)))); show_prog = logical(show_prog(1)); show_res = logical(show_res(1));
% 3?ê??ˉ?·???¢??μ?μ????? num_brks = salesmen-1;
dof = n - min_tour*salesmen; % ?éò?×?óé·??êμ?3?êDêy addto = ones(1,dof+1); for k = 2:num_brks addto = cumsum(addto); end
cum_prob = cumsum(addto)/sum(addto);
% 3?ê??ˉ??èo
pop_rte = zeros(pop_size,n); % ?·???ˉo?μ???èo pop_brk = zeros(pop_size,num_brks); % ??μ??ˉo?μ???èo for k = 1:pop_size
pop_rte(k,:) = randperm(n)+1; pop_brk(k,:) = randbreaks(); end
% ??????í?ê±μ???éìè?μ???é? ?éé?襣?
clr = [1 0 0; 0 0 1; 0.67 0 1; 0 1 0; 1 0.5 0]; if salesmen > 5
clr = hsv(salesmen); end
% ?aê???DDò?′???·¨1y3ì
global_min = Inf; %3?ê??ˉ×??ì?·?? total_dist = zeros(1,pop_size); dist_history = zeros(1,num_iter);
tmp_pop_rte = zeros(8,n); %μ±?°μ??·??éè?? tmp_pop_brk = zeros(8,num_brks); %μ±?°μ???μ?éè?? new_pop_rte = zeros(pop_size,n); %?üD?μ??·??éè?? new_pop_brk = zeros(pop_size,num_brks);%?üD?μ???μ?éè??