clear all;clc;close all;
%進化策略解決旅行商問題
%{
日期:
20190912_ZD
遺傳算法強調染色體的操作,進化策略強調個體級的行爲變化,而進化規劃則強
強調種羣級別上的行爲變化,現在學術界上將GA,ES,EP統稱爲進化算法EC
%}
t0 = clock;
N = 10;%初始種羣規模
C = [1,2;70,90;80,60;10,100;800,200;800,100;90,80;200,600;230,4;500,90];%城市座標
M = size(C,1);%城市個數
for i = 1:N
X(i,:) = randperm(M);%初始種羣
end
Inter = 5000;%迭代次數
BestFitness = -inf;%記錄最大適應度
BestIndividual = zeros(1,M);%最優個體
BestFitnessInter = zeros(1,Inter);
MeanFitness = zeros(1,Inter);
D = zeros(M,M);
%計算各個城市之間的距離
for i = 1:M
for j = 1:M
D(i,j) = sqrt( sum((C(i,:) - C(j,:) ).^2));
end
end
%進行迭代
for i = 1:Inter
%隨機生成新的種羣
NewX = zeros(100,N);%生成新的種羣
for Num = 1:100
%通過初始種羣繁殖生成新的種羣(注重個體行爲)
pos1 =1 + fix( rand*N );
pos2 = randperm(M);
NewX(Num,:) = X(pos1,pos2);
end
%計算適應度
Distance = zeros(Num,1);
for k = 1:Num
for kk = 1:N-1
Distance(k) = Distance(k) + D(NewX(k,kk),NewX(k,kk+1));
end
Distance(k) = Distance(k) + D(NewX(k,1),NewX(k,end));
end
Fitness = 1 ./ Distance;
%按照適應進行排名
[SortFitness,Label] = sort(Fitness,'descend');
LabelSelect = Label(1:N);
%選擇出N個新的初始種羣
X = NewX(LabelSelect,:);
%比較最大適應度與原最大適應,並更新最大適應度
if SortFitness(1) > BestFitness
BestFitness = SortFitness(1);
BestIndividual = NewX(Label(1),:);
end
BestFitnessInter(i) = BestFitness;
MeanFitness(i) = mean(Fitness);
end
%繪製結果
time = etime(clock,t0);
disp('優化時間爲')
disp(time)
plot(BestFitnessInter,'LineWidth',3);
hold on
plot(MeanFitness,'LineWidth',3);
legend('BestFitness','MeanFitness')
title('旅行商問題')
disp('最短路徑爲:')
disp(BestIndividual)
disp('最短距離爲:')
disp(1/BestFitness)
figure
BestIndividual = [BestIndividual,BestIndividual(1)];
h = plot(C(BestIndividual,1),C(BestIndividual,2),'ro-');
set(h,'Linewidth',3,'MarkerSize',10)
title(['旅行商問題,最短路徑爲',num2str(1/BestFitness)]);
xlabel('x座標');ylabel('y座標')
legend('City')
運行結果: