?? main_ga.m
字號:
%P199_8 GA
clc;
clear;
pop_size=100;%種群大小
m=42;%每個個體的基因數(shù)目
m1=21;%每個個體中x1占的位數(shù)
m2=21;%每個個體中x2占的位數(shù)
%產(chǎn)生初始種群
for j=1:pop_size
for i=1:m
num=randperm(2)-1;
str_num(j,i)=dec2bin(num(1));%隨機產(chǎn)生的二進制數(shù),pop_size個,每個m位
end
end
delta=10;
cc=0;%迭代次數(shù)
while delta>0.01%for qq=1:500%大循環(huán)
for j=1:pop_size
for i=1:m
if i<=m1
str_num1(j,i)=str_num(j,i);
else
str_num2(j,i)=str_num(j,i);
end
end
end
f1=bin2dec(str_num1);%x1的適應(yīng)值
f2=bin2dec(str_num2);%x2的適應(yīng)值
x1=-100+f1*(100-(-100))/(2^m1-1);%-3.0+f1*(12.1-(-3.0))/(2^m1-1);
x2=-100+f2*(100-(-100))/(2^m2-1);%4.1+f2*(5.8-4.1)/(2^m2-1);
f=fun_value(x1,x2);%適應(yīng)值
delta=abs(max(f)-1);
%選擇
%1.各染色體總和
f_sum=sum(f);
%2.選擇概率
p=f/f_sum;
%3.累積概率
p_sum1=0;
for a=1:pop_size
p_sum1=p_sum1+p(a);
p_sum(a)=p_sum1;
end
%4.產(chǎn)生隨機數(shù)進行染色體選擇
r=rand(1,pop_size);
for k=1:pop_size
for l=1:pop_size
if r(k)<p_sum(l)
str_num01(l)=p_sum(l);
else
str_num01(l)=1;
end
end
[sv,ss]=min(str_num01);
serials(k)=ss;%serials--要選擇的染色體序號
end
for h=1:pop_size
v(h,:)=str_num(serials(h),:);%v--交換后的染色體序列
end
%交叉
t=zeros(1,pop_size);
rr=rand(1,pop_size);
kkk=0;
for kk=1:pop_size
if rr(kk)<0.25
t(kk)=kk;%參與交叉的個體號
kkk=kkk+1;
end
end
if kkk>=2
[tv1,ts1]=max(t);%ts1,ts2參與交叉
t(ts1)=0;
[tv2,ts2]=max(t);
else
ts1=1;
ts2=1;
end
tsp01=randperm(m-1);
tsp=tsp01(1);%交叉位的選擇
vstar1(ts1,:)=v(ts1,:);
vstar2(ts2,:)=v(ts2,:);
for ii=1:m
for jj=1:tsp
v1(jj)=vstar1(ts1,m+1-jj);
v2(jj)=vstar2(ts2,m+1-jj);
v(ts1,m+1-jj)=v2(jj);
v(ts2,m+1-jj)=v1(jj);
end
end
%變異
k=1:m*pop_size;%種群中總的基因數(shù)目
pm=0.01;%變異率
c=pm*k(end);%每代中平均變異的基因個數(shù)
if c~=fix(c)
c=fix(c)+1;%取變異基因個數(shù)
else
c=fix(c);
end
d=randperm(k(end));
for i=1:c
d1(i)=d(i);%取出變異的位址
d2(i)=fix(d1(i)/m)+1;%染色體號
d3(i)=mod(d1(i),m);%染色體位數(shù)
if d3(i)==0
d3(i)=m;
d2(i)=d2(i)-1;
end
end
for hh=1:length(d1)
if v(d2(hh),d3(hh))=='1'
v(d2(hh),d3(hh))='0';
else
v(d2(hh),d3(hh))='1';
end
end
str_num=v;
cc=cc+1;
end%大循環(huán)
fprintf('迭代次數(shù):')
cc
fprintf('最優(yōu)值:')
[valuef,tif]=max(f);
valuef
fprintf('最優(yōu)解:')
v(tif,:)
x1(tif)
x2(tif)
%ran_num=randperm(num);
%b=dec2bin(a)
%for i=1:length(b)
% b(2)='1';
%end
% b
%c=bin2dec(b)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -