資源簡(jiǎn)介
1)本程序主要針對(duì)測(cè)試函數(shù)集ZDT1進(jìn)行的NSGA-Ⅱ算法的編寫(xiě);
2)本程序有詳細(xì)的備注解釋;
3)本文件里包含論文《非支配排序遺傳算法(NSGA)的研究與應(yīng)用》.pdf,用來(lái)指導(dǎo)學(xué)習(xí)NSGA-Ⅱ算法

代碼片段和文件信息
function?NSGAII()
clc;
%?format?compact;
tic;
%?hold?on
%--初始化?參數(shù)設(shè)定
generations=100;????????%迭代次數(shù)
popnum=100;?????????????%種群大小(偶數(shù))
poplength=30;???????????%個(gè)體長(zhǎng)度
minvalue=repmat(zeros(1poplength)popnum1);???%個(gè)體最小值---B?=?repmat(A?m?n)?%將矩陣A復(fù)制m*n塊,即B由m*n塊A平鋪而成
maxvalue=repmat(ones(1poplength)popnum1);????%個(gè)體最大值
population=rand(popnumpoplength).*(maxvalue-minvalue)+minvalue;????%產(chǎn)生新的初始種群
????%--開(kāi)始迭代進(jìn)化
????for?gene=1:generations??????%開(kāi)始迭代
????????%--交叉
????????newpopulation=zeros(popnumpoplength);??%子代種群
????????for?i=1:popnum/2????????????????????????%交叉產(chǎn)生子代
????????????k=randperm(popnum);?????????????????%從種群中隨機(jī)選擇出兩個(gè)父母,不采用二進(jìn)制聯(lián)賽方法
????????????beta=(-1).^round(rand(1poplength)).*abs(randn(1poplength))*1.481;?????%采用正態(tài)分布交叉產(chǎn)生兩個(gè)子代
????????????newpopulation(i*2-1:)=(population(k(1):)+population(k(2):))/2+beta.*(population(k(1):)-population(k(2):))./2;??%產(chǎn)生第一個(gè)子代
????????????newpopulation(i*2:)=(population(k(1):)+population(k(2):))/2-beta.*(population(k(1):)-population(k(2):))./2;????%產(chǎn)生第二個(gè)子代
????????end
????????%--變異
????????k=rand(size(newpopulation));????%隨機(jī)選擇要變異的基因位
????????miu=rand(size(newpopulation));??%采用多項(xiàng)式變異
????????temp=k<1/poplength?&?miu<0.5;???%要變異的基因位
????????newpopulation(temp)=newpopulation(temp)+(maxvalue(temp)-minvalue(temp)).*((2.*miu(temp)+(1-2.*miu(temp)).*(1-(newpopulation(temp)-minvalue(temp))./(maxvalue(temp)-minvalue(temp))).^21).^(1/21)-1);????????%變異情況一
????????newpopulation(temp)=newpopulation(temp)+(maxvalue(temp)-minvalue(temp)).*(1-(2.*(1-miu(temp))+2.*(miu(temp)-0.5).*(1-(maxvalue(temp)-newpopulation(temp))./(maxvalue(temp)-minvalue(temp))).^21).^(1/21));??%變異情況二
????????%--越界處理/種群合并
????????newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue);?%子代越上界處理
????????newpopulation(newpopulation ????????newpopulation=[population;newpopulation];???%合并父子種群
????????%--計(jì)算目標(biāo)函數(shù)值
????????functionvalue=zeros(size(newpopulation1)2);???%合并后種群的各目標(biāo)函數(shù)值,這里問(wèn)題是ZDT1
????????functionvalue(:1)=newpopulation(:1);???%計(jì)算第一維目標(biāo)函數(shù)值
????????g=1+9*sum(newpopulation(:2:poplength)2)./(poplength-1);
????????functionvalue(:2)=g.*(1-(newpopulation(:1)./g).^0.5);?%計(jì)算第二維目標(biāo)函數(shù)值
????????%--非支配排序
????????fnum=0;?????%當(dāng)前分配的前沿面編號(hào)
????????cz=false(1size(functionvalue1));??????%記錄個(gè)體是否已被分配編號(hào)
????????frontvalue=zeros(size(cz));?????????????%每個(gè)個(gè)體的前沿面編號(hào)
????????[functionvalue_sortednewsite]=sortrows(functionvalue);?%對(duì)種群按第一維目標(biāo)值大小進(jìn)行排序?則第一行個(gè)體p即為種群中支配個(gè)體p的數(shù)量為零的個(gè)體,Np=0
????????while?~all(cz)??????%開(kāi)始迭代判斷每個(gè)個(gè)體的前沿面,采用改進(jìn)的deductive?sort
????????????fnum=fnum+1;
????????????d=cz;
????????????for?i=1:size(functionvalue1)?%:(1)找到種群中所有n=0的個(gè)體,并保存在當(dāng)前集合F1中;
????????????????if?~d(i)
????????????????????for?j=i+1:size(functionvalue1)?%判斷i對(duì)應(yīng)的所有集合里面的支配和非支配的解,被i支配則為1,不被i支配則為0
????????????????????????if?~d(j)
????????????????????????????k=1;
????????????????????????????for?m=2:size(functionvalue2)?%判斷是否支配,找到個(gè)體p不支配的個(gè)體,標(biāo)記為k=0
???????
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件????????5838??2019-04-12?22:40??NSGA_Ⅱ\NSGAII.m
?????文件?????????310??2019-04-12?22:59??NSGA_Ⅱ\備注.txt
?????文件?????1970580??2019-03-15?16:20??NSGA_Ⅱ\非支配排序遺傳算法(NSGA)的研究與應(yīng)用.pdf
評(píng)論
共有 條評(píng)論