%%%*****用遗传算法求函数最大值(双输入单输出)****%%%%%
clc;
clear;
x1min=-3.0; %输入变量1的变化范围
x1max=12.1;
x2min=4.1; %输入变量2的变化范围
x2max=5.8;
pb=0.001; %变异概率
N=20; %初始种群数目=20
s1=ceil(log2(1000*(x1max-x1min))); %计算二进制串的长度
s2=ceil(log2(1000*(x2max-x2min)));
s=s1+s2; %%种群的位数
zq=randint(N,s); %产生初始种群,库函数和for循环均可
% for i=1:N
% for j=1:s
% r=rand(1);
% if r>0.5
% zq(i,j)=1;
% else zq(i,j)=0;
% end
% end
% end
%%*****用于二进制转化为十进制****
for i=1:s1
zhuanhuan(i,1) = 2^(s1-i);
end
for i=s1+1:s
zhuanhuan(i,1) = 2^(s-i);
end
for k=1:500 %遗传算法的次数
%%********将二进制转换成十进制
for i=1:N
j1(i)=zq(i,1:s1)*zhuanhuan(1:s1);
j2(i)=zq(i,s1+1:s)*zhuanhuan(s1+1:s);
end
%%****转化为目标函数值
x1=x1min+j1*(x1max-x1min)/(2^s1-1);
x2=x2min+j2*(x2max-x2min)/(2^s2-1);
%%****计算适配值
f=21.5+x1.*sin(4*pi*x1)+x2.*sin(20*pi*x2);
%%%******依次得到最大值,平均值
f_max(k)=max(f);
f_sum=sum(f);
f_avr(k)=sum(f)/N;
%%******复制********
g=f/f_sum; %计算选择概率
q(1)=g(1); %计算累计概率
for i=2:N
q(i)=q(i-1)+g(i);
end
for i=1:N %轮盘赌法
r=rand(1);
for j=1:N
if r<=q(j)
zq1(i,:)=zq(j,:);
break;
end
end
end
zq = zq1;
%%*****交叉操作*****
zq2 = zq;
zz = randperm(N);%产生交叉顺序
for i=1:N/2
v1 = randperm(s1-1);%产生交叉位
v2 = randperm(s2-1);
for j=v1(1)+1:s1 %交叉
t = zq2(zz(i*2-1),j);
zq2(zz(i*2-1),j) = zq2(zz(i*2),j);
zq2(zz(i*2),j) = t;
end
for j=v2(1)+1:s2
t = zq2(zz(i*2-1),j+s1);
zq2(zz(i*2-1),j+s1) = zq2(zz(i*2),j+s1);
zq2(zz(i*2),j+s1) = t;
end
end
zq = zq2;
%%*********变异操作****
for i=1:N
for j=1:s
if rand(1)<pb
if zq(i,j)==1
zq(i,j)=0;
else zq(i,j)=1;
end
end
end
end
end
figure()%绘图
subplot(2,1,1),plot(f_max),title('适配值最大值');
subplot(2,1,2),plot(f_avr),title('适配值平均值');
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
yc_zuoye.rar (1个子文件)
yc_zuoye.m 2KB
共 1 条
- 1
jietouxiaohu
- 粉丝: 5
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
前往页