資源簡介
單目標最優化問題的遺傳算法,可用與數學建模中,很方便快捷,matlab

代碼片段和文件信息
function[xvfv]=GA(fitnessabNPNGpcpmeps)
%待優化的目標函數:fitness
%自變量下界:a
%自變量上界:b
%種群個體數:NP
%最大進化代數:NG
%雜交概率:pc
%自變量概率:pm
%自變量離散精度:eps
%目標函數取最大值時的自變量值:xm
%目標函數的最大值:fv
L=ceil(log2((b-a)/eps+1));???%根據離散精度,確定二進制編碼需要的碼長
x=zeros(NPL);
for?i=1:NP
????x(i:)=Initial(L);%種群初始化
????fx(i)=fitness(Dec(abx(i:)L));??%個體適應值
end
for?k=1:NG
????sumfx=sum(fx);???%所有個體適應值之和
????px=fx/sumfx;???%所有個體適應值的平均值
????ppx=0;
????ppx(1)=px(1);
????for?i=2:NP??????%用于輪盤賭策略的累加
????????ppx(i)=ppx(i-1)+px(i);
????end
????for?i=1:NP
????????sita=rand();
????????for?n=1:NP
????????????if?sita<=ppx(n)
????????????????SelFather=n;??%根據輪盤賭策略確定的父親
????????????????break;
????????????end
????????end
????????Selmother=floor(rand()*(NP-1))+1;??%隨機選擇母親
????????posCut=floor(rand()*(L-2))+1;???%隨機選擇交叉點
????????r1=rand();
????????if?r1<=pc???????????????????????%交叉??????????
????????????nx(i1:posCut)=x(SelFather1:posCut);
????????????nx(i(posCut+1):L)=x(Selmother(posCut+1):L);
????????????r2=rand();
????????????if?r2<=pm????%變異
????????????????posMut=round(rand()*(L-1)+1);
????????????????nx(iposMut)=~nx(iposMut);
????????????end
????????else
????????????nx(i:)=x(SelFather:);
????????end
????end
????x=nx;
????for?i=1:NP
????????fx(i)=fitness(Dec(abx(i:)L));%子代適應值
????end
end
fv=-inf;
for?i=1:NP
????fitx=fitness(Dec(abx(i:)L));
????if?fitx>fv
????????????fv=fitx;???????%取個體中的最好值作為最終結果
????????????xv=Dec(abx(i:)L);
????????end
????end
????function?result=Initial(length)???%初始化函數
????for?i=1:length
????????r=rand();
????????result(i)=round(r);
????end
????????function?y=Dec(abxL)??%二進制編碼轉換為十進制編碼
????????????base=2.^((L-1):-1:0);
????????????y=dot(basex);
????????????y=a+y*(b-a)/(2^L-1);
????????????%[xvfv]=GA(@fitness030501000.90.040.01)
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????2021??2013-09-12?21:03??GA.m
-----------?---------??----------?-----??----
?????????????????2021????????????????????1
評論
共有 條評論