clear all
%% 初始化参数
T=100;%仿真代数
N=10;% 群体规模
n=2;%变量个数
% pm=0.0018;pc=0.7;% 交叉变异概率
L=10;%单个参数字串长度,总编码长度 n*L
bval=round(rand(N,n*L));% 初始种群
for tt=1:10
bestv=inf;% 最优适应度初值
for iiii=1:200
%% 迭代开始
%解码,计算适应度
for iii=1:T
for i=1:N
for ii=1:n
x(ii)=0;
Z=3;%前Z个二进制表示整数位
for j=(1+L*(ii-1)):(Z+L*(ii-1))
x(ii)=x(ii)+bval(i,Z+L*(ii-1)+L*(ii-1)-j+1)*2^(j-L*(ii-1)-1);%整数位
end
x(ii)=x(ii)+sum( bval(i,((ii-1)*L+Z+1):(ii*L)).*2.^(-1:-1:-(L-Z)));%小数位+整数位
%判断是不是在[-4.5,4.5]这个区间,不在的话,随机产生一个满足区间的数代替
if x(ii)>4.5
x(ii)=4.5*rand(1);
end
end
X(i,:)=x;
[obj(i)] = objfunc(X(i,1),X(i,2));
end
func=obj;% 目标函数转换为适应度函数
p=func./sum(func);
p = 1./p;%用轮盘赌选择求最小值,需要倒一下,这样才是求最小值
p = p./sum(p);
q=cumsum(p);%累加
[fmin,indmin]=min(func);% 求当代最佳个体
% [fmax,indmax]=max(func);% 求当代最佳个体
if fmin<=bestv
bestv=fmin;% 到目前为止最优适应度值
bvalxx=bval(indmin,:);% 到目前为止最佳位串
optxx=X(indmin,:);% 到目前为止最优参数
end
Bfit1(iii)=bestv;%存储每代的最优适应度
%% 自适应遗传算法做准备
fave = sum(func)/N;
fmax = max(func);
k1 = 1;
k2 = 0.005;
%% 遗传操作开始
if asin(fave/fmax)>=pi/6
pc = k1 * (1-asin(fave/fmax)/(pi/2));
pm = k2 * asin(fave/fmax)/(pi/2);
%位点变异
mm=rand(N,n*L)<pm;%N 行, 小于变异概率的赋值为 1,其他赋值 0
mm(N,:)=zeros(1,n*L);% 最后一行不变异,强制赋 0
bval(mm)=1-bval(mm); %bval(mm) 把 mm中赋值为 1 的基因提取出来
%单点交叉操作
for i=1:2:(N-1)
cc=rand;
if cc<pc
position = ceil(rand*(L/2));%每个字符串,从postion位置开始往后L/2个被当做交叉字符
long = floor(L/2);%这就是前面提的L/2
ch=bval(i,:);
for j=1:n
bval(i,(position+(j-1)*L):(long+position+(j-1)*L))=bval(i+1,(position+(j-1)*L):(long+position+(j-1)*L));
bval(i+1,(position+(j-1)*L):(long+position+(j-1)*L))=ch(1,(position+(j-1)*L):(long+position+(j-1)*L));
end
end
end
bval(N,:)=bvalxx;% 最优保留
%轮盘赌选择
for i=1:(N-1)
r=rand;
tmp=find(r<=q);
newbval(i,:)=bval(tmp(1),:);
end
newbval(N,:)=bvalxx;% 最优保留
bval=newbval;
else
pc = k1 * asin(fave/fmax)/(pi/2);
pm = k2 * (1-asin(fave/fmax)/(pi/2));
%单点交叉操作
for i=1:2:(N-1)
cc=rand;
if cc<pc
position = ceil(rand*(L/2));%每个字符串,从postion位置开始往后L/2个被当做交叉字符
long = floor(L/2);%这就是前面提的L/2
ch=bval(i,:);
for j=1:n
bval(i,(position+(j-1)*L):(long+position+(j-1)*L))=bval(i+1,(position+(j-1)*L):(long+position+(j-1)*L));
bval(i+1,(position+(j-1)*L):(long+position+(j-1)*L))=ch(1,(position+(j-1)*L):(long+position+(j-1)*L));
end
end
end
%位点变异
mm=rand(N,n*L)<pm;%N 行, 小于变异概率的赋值为 1,其他赋值 0
mm(N,:)=zeros(1,n*L);% 最后一行不变异,强制赋 0
bval(mm)=1-bval(mm); %bval(mm) 把 mm中赋值为 1 的基因提取出来
%轮盘赌选择
for i=1:(N-1)
r=rand;
tmp=find(r<=q);
newbval(i,:)=bval(tmp(1),:);
end
newbval(N,:)=bvalxx;% 最优保留
bval=newbval;
end
end
%% 输出
bestvf(iiii)=bestv; % 输出最优适应度值
bestp(iiii,:)=optxx;
end
%% 画图像,直观体现预测结果
b(tt,:) = min(bestvf);%输出寻得的最优自变量位置和最优输出变量
k=find(bestvf==min(bestvf));
a(tt,:) = bestp(k(1),:);
bb(tt,:) = bestvf;
end
min(b)
a(find(min(b)==b),:)
% subplot(1,2,1)
% plot(bestvf)
%
% subplot(1,2,2)
% x = [-4.5:0.1:4.5];y = [-4.5:0.1:4.5];
% [XX,YY]=meshgrid(x,y);
% [Z] = objfunc(XX,YY);
% surf(XX,YY,Z);
%% objective optimizitation function
function [f1] = objfunc(x,y);
f1 = (1.5- x + x.*y).^2 + (2.25 - x + x.*y.^2).^2 + (2.625 - x + x.*y.^3).^2;%-4.5<=x;y<=4.5,最小值为0,此时(3,0.5)
f3 = 0.5 - ((sin(sqrt(x.^2+y.^2))).^2 -0.5)./(1+0.001*(x.^2+y.^2)).^2 ;%最大值为1,此时(0,0);x,y是[-10,10]
end