簡單的多目標遺傳算法實現

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

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