📄 main_ga.m
字号:
%P199_8 GA
clc;
clear;
pop_size=100;%种群大小
m=42;%每个个体的基因数目
m1=21;%每个个体中x1占的位数
m2=21;%每个个体中x2占的位数
%产生初始种群
for j=1:pop_size
for i=1:m
num=randperm(2)-1;
str_num(j,i)=dec2bin(num(1));%随机产生的二进制数,pop_size个,每个m位
end
end
delta=10;
cc=0;%迭代次数
while delta>0.01%for qq=1:500%大循环
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的适应值
f2=bin2dec(str_num2);%x2的适应值
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);%适应值
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.产生随机数进行染色体选择
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;%种群中总的基因数目
pm=0.01;%变异率
c=pm*k(end);%每代中平均变异的基因个数
if c~=fix(c)
c=fix(c)+1;%取变异基因个数
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);%染色体位数
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%大循环
fprintf('迭代次数:')
cc
fprintf('最优值:')
[valuef,tif]=max(f);
valuef
fprintf('最优解:')
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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -