基于实数编码的GA算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

clc;
clear;
N=500; %种群规模
T=500; %迭代次数
Pc_1=0.9; Pc_2=0.4; %交叉概率
Pm_1=0.3;Pm_2=0.005; %变异概率
Umax=10;Umin=-10; %自变量范围
L=7; %变量x的个数
S=50; %轮盘赌选择个体数目
pop=Umin+(Umax-Umin)*rand(N,L); %初始化种群
x=[]; %保存一个个体向量x的L个值
g=[]; %保存一个个体约束函数g(i)的值
fa_max_pre=0; %设定上一代测试函数最优函数值
fa=[]; %保存当代测试函数N个体的函数值
p=[]; %保存当代种群N个个体罚函数值
obj=[]; %保存每代N个个体目标函数的值
Fa_min=[]; %保存每代测试函数最小值
for t=1:T; %第t代
b=0; %初始化b,用于累加
for n=1:N; %开始构造罚函数
x=pop(n,:); %本代的自变量向量
obj(n)=(x(1)-10)^2+5*(x(2)-12)^2+x(3)^4+3*(x(4)-11)^2+10*x(5)^6+7*x(6)^2+x(7)^4-4*x(6)*x(7)-10*x(6)-8*x(7);
g(1)= -127+2*x(1)^2+3*x(2)^4+x(3)+4*x(4)^2+5*x(5);
g(2)=-282+7*x(1)+3*x(2)+10*x(3)^2+x(4)-x(5);
g(3)=-196+23*x(1)+x(2)^2+6*x(6)^2-8*x(7);
g(4)=4*x(1)^2+x(2)^2-3*x(1)*x(2)+2*x(3)^2+5*x(6)-11*x(7);
g=(g+abs(g))/2; %对约束函数进行处理,g<0是按零处理
p(n)=sum(g); %约束函数的和
if g(:)==0 %计算可行解的数目
b=b+1; %可行解数目的累加
end
end
m(t)=b; %可行解个数
c=100*(0.8*(1-t/T)+1.2*(1-b/N)); %构造罚因子
fa=obj+c*p; %构造测试函数第一步
fa_dao=1./fa; %利用测试函数构造适合用于轮盘赌的函数
[fa_max,No]=max(fa_dao); %找到测试函数的最大值和序号
obj_min(t)=obj(No); %保存每代目标函数最小值
Fa_min(t)=1/fa_max; %保存每代归测试函数最大值
x_best=pop(No,:); %保存测试函数最大值对应的x值(L位x)
if (fa_max>=fa_max_pre)||(t==1); %如果本代罚函数最大值大于上一代最大值则保存
fa_max_pre=fa_max; %本代最优解保存
pop(N,:)=x_best; %本代最优解保存到种群第N个个体中
end
%///////////// 轮盘赌法选择进入下一代的个体 /////////////////
fa_sum=sum(fa_dao); %求出N个测试函数倒数的和
fit=fa_dao./fa_sum; %求出N个罚函数倒数数值在种群中占得比例,以此作为适应度函数
fit_cum=cumsum(fit); %以适应度来设计轮盘
for k=1:S; %选S个个体进行交叉变异
r=find(fit_cu

m>=rand); %产生一个随机数,找出比它大的个体累积适应度序号
pop(k,:)=pop(r(1),:); %选择第一个序号
end
fit_avg=1/N;
fit_max=max(fit);
%///////////// 交叉 //////////////////////////////
for i=1:2:N-3; %选出交叉的一对父代
if fit(i)>=fit_avg; %自适应Pc
Pc=Pc_1-(Pc_1-Pc_2)*(fit(i)-fit_avg)/(fit_max-fit_avg);
else Pc=Pc_1;
end
if rand<=Pc; %判断是否进行交叉
alpha=rand; %产生交叉概率alpha
for j=1:L; %每个个体的L个x(i)都进行算数交叉
temp_1=pop(i,j);
temp_2=pop(i+1,j);
pop(i,j)=alpha*temp_2+(1-alpha)*temp_1;%交叉产生新的x
pop(i+1,j)=alpha*temp_1+(1-alpha)*temp_2;
end
end
end
%//////////// 变异 ///////////////////////////////
for i=1:N-1 %选择变异个体
if fit(i)>=fit_avg; %自适应Pm
Pm=Pc_1-(Pm_1-Pm_2)*(fit(i)-fit_avg)/(fit_max-fit_avg);
else Pm=Pm_1;
end
j=ceil(L*rand); %产生进行变异个体x的向量序号
beta=rand;
h=1-beta^((1-t/T)^2); %非均匀变异
x_1=(Umax-pop(i,j))*h;
x_2=(pop(i,j)-Umin)*h;
if rand<=Pm %判断变异类型
pop(i,j)=pop(i,j)+x_1; %变异产生新的x(s)
else
pop(i,j)=pop(i,j)-x_2;
end
end
end
subplot(2,2,1);plot(1:T,Fa_min);xlabel('迭代次数');ylabel('测试函数值');
subplot(2,2,2);plot(1:T,obj_min);xlabel('迭代次数');ylabel('目标函数值');
subplot(2,2,3);plot(1:T,m/N);xlabel('迭代次数');ylabel('可行解比例');
x_best; %最优解
A=Fa_min(T) %测试函数最小值
B=obj_min(T) %目标函数最小值















相关文档
最新文档