天天看點

簡單的多目标遺傳算法實作

function MultiGA()

%% 運作此程式之前先安裝謝爾菲德遺傳算法工具箱。

%% 遺傳算法求解多目标優化案例

%% 将原多目标函數改寫為f1=(x^2+y^2)/4;f2=x(1-y)+10;

% 運用線性疊加法,F=a*f1(x)+b*f2(x)  ,a+b=1

% 總目标函數改寫為  f=0.6*(x^2+y^2)/4+0.4*(x*(1-y)+10);  

popse=100;  % 種群數目

maxgen=50;  % 最大疊代次數

preci=20;   % 編碼長度

gap=0.95;   % 代溝大小

px=0.7;     % 交叉機率

pm=0.01;    %變異機率

lbx=1;      % 變量下界

lby=1;

ubx=4;      % 變量上界

uby=2;

trace=zeros(3,maxgen);  % 定義尋優結果的初始值

FieldD=[preci preci;lbx lby;ubx uby;1 1;0 0;1 1;1 1]; % 區域描述器

chrom=crtbp(popse,preci*2);  % 建立随機種群

% 優化

gen=0;

pop=bs2rv(chrom,FieldD);    % 進制轉換

X=pop(:,1);Y=pop(:,2);

objv=0.15*(X.^2+Y.^2)+0.4*(X.*(1-Y)+10);  % 目标函數

while gen < maxgen

    fitnv=ranking(-objv);

    selch=select('sus',chrom,fitnv,gap);    % 選擇 ‘sus’表示為随機周遊抽樣

    selch=recombin('xovmp',selch,px);       % 重組  ‘xovmp’表示多點交叉

    selch=mut(selch,pm);

    pop=bs2rv(selch,FieldD);                 % 子代個體進行進制轉換

    X=pop(:,1);Y=pop(:,2);

    objvsel=0.15*(X.^2+Y.^2)+0.4*(X.*(1-Y)+10);

    [chrom,objv]=reins(chrom,selch,1,1,objv,objvsel);

    pop=bs2rv(chrom,FieldD);

    gen=gen+1;

    [Y,I]=max(objv);

    trace(1:2,gen)=pop(I,:);

    trace(3,gen)=Y;

end

%% 畫出求解結果

figure(1)

plot3(trace(1,:),trace(2,:),trace(3,:),'b');  % 畫出每代最優點

xlabel('x')

ylabel('y')

zlabel('f')

figure(2)

plot(1:maxgen,trace(3,:));  

xlabel('疊代次數')

ylabel('最優解')

bestz=trace(3,end);

bestX=trace(1,end);

bestY=trace(2,end);

fprintf(['最優解:\n X=',num2str(bestX),'\n Y=',num2str(bestY),'\n z=',num2str(bestz)])

繼續閱讀