優化算法之進化策略

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')

運行結果:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章