資源簡介
遺傳算法求解Rastrigin函數遺傳算法求解Rastrigin函數遺傳算法求解Rastrigin函數遺傳算法求解Rastrigin函數
代碼片段和文件信息
function?ga
%遺傳算法極小值問題
clear
clc
bn=50;?????%個體串長度
inn=50;????%初始種群大小
gnmax=600;?%最大迭代次數
pc=0.8;???%交叉概率
pm=0.1;???%變異概率
%產生初始種群
fps=10.24*(rand(innbn)-0.5*ones(innbn));??%十進制編碼,使初始解在[-5.12,5.12]范圍內
select=fps;
gn=0;
%第一代解
n?=?30;
fr?=?4000;
while?gn %分別將種群代入目標函數計算適應度
q?=?0;
p?=?0;
for?i?=?1:50
???for?j?=?1:50
???????x(j)=select(ij:j);
???????q?=?q+x(j)^2+10;
???????p?=?p+10*cos(2*pi*x(j));
???end
???????y(i)=q-p;
???????q=0;
???????p=0;????
end
[pmini]=min(y);%將當前種群中最優解保存在pmin
pmin1=pmin;
vari=mean(select(i:));%計算最優染色體的平均值并送給vari,變異自適應調節域值
l=i;%將最優染色體行坐標傳送給l
[pmaxz]=max(y);%求取適應度最差的染色體
select(z:)=select(l:);%將最優染色體引入種群參與競爭
%進行交叉,進一步選擇優秀的解
for?i=1:2:50
????pcc=pro(pc);%根據交叉概率判斷是否進行交叉
????if?pcc==1
????????if?0<=l-i<=1%判斷是不是最優染色體,如果是不進行交叉
?????cross(i:)=select(i:);
?????cross(i+1:)=select(i+1:);
????????else
????%將30個變量分為五個范圍,相臨兩個染色體分別從五位進行交叉
????crb1=round(rand*(bn/5-1))+1;??%在[16]范圍內隨機產生一個交叉位
????cross(icrb1:crb1)=0.1*select(icrb1:crb1)+0.9*select(i+1crb1:crb1);
????for?j=1:9
???cross(i+1j*crb1:j*crb1)=0.1*select(ij*crb1:j*crb1)+0.9*select(i+1j*crb1:j*crb1);
????cross(i(j+1)*crb1:(j+1)*crb1)=0.1*select(i(j+1)*crb1:(j+1)*crb1)+0.9*select(i+1(j+1)*crb1:(j+1)*crb1);
???
????end
??????%??%%%%
???%??cross(i+1crb1:crb1)=0.1*select(icrb1:crb1)+0.9*select(i+1crb1:crb1);
?????%cross(i2*crb1:2*crb1)=0.1*select(i2*crb1:2*crb1)+0.9*select(i+12*crb1:2*crb1);
?????%cross(i+12*crb1:2*crb1)=0.1*select(i2*crb1:2*crb1)+0.9*select(i+12*crb1:2*crb1);
?????%cross(i3*crb1:3*crb1)=0.1*select(i3*crb1:3*crb1)+0.9*select(i+13*crb1:3*crb1);
?????%cross(i+13*crb1:3*crb1)=0.1*select(i3*crb1:3*crb1)+0.9*select(i+13*crb1:3*crb1);
?????%cross(i4*crb1:4*crb1)=0.1*select(i4*crb1:4*crb1)+0.9*select(i+14*crb1:4*crb1);
?????%cross(i+14*crb1:
評論
共有 條評論