%一步步编写代码实现遗传算法实现的功能
clear all; clc; close all;
global pop_size
pop_size=20;
generation=100;
p_c=0.9;
p_mu=0.1;
length=8;
parents=randi([0,1],pop_size,length);
for k=1:generation
Fit=cal_fit_con(parents);
maxFit=max(Fit(:,1));
minFit=min(Fit(:,1));
rr=find(Fit(:,1)==maxFit);
xBest=parents(rr(1,1),:);%利用上面找到的适应度最大的位置来找出对应的自变量x的编码。
yBest=Fit(rr(1,1),1);%利用上面找到的适应度最大的位置来找出对应的函数值
%%这里为什么要用最大最小值进行归一化处理?为什么不直接用个体适应度除以总适应度,得出比率。
%基于轮盘赌的选择操作,又称比例选择方法,其基本思想是:各个个体被选中的概率与其适应度大小成正比
Fit0=(Fit(:,1)-minFit)/(maxFit-minFit);
sum_Fit=sum(Fit0);
fitvalue=Fit0./sum_Fit;%以上三步,通过归一化,求出每个个体的适应度,计算出他们被遗传到下一代群体中的概率 fitvalue。
fitvalue=cumsum(fitvalue);%计算出每个个体的积累概率;??
ms=sort(rand(pop_size,1));%在[0,1]区间内产生一个均匀分布的伪随机数ms
fiti=1;
newi=1;
while newi<=pop_size && fiti<=pop_size%若个体的累计概率大于伪随机数ms,则选择个体fiti,重复pop_size次。
if (ms(newi)<fitvalue(fiti))
nparents(newi,:)=parents(fiti,:);
newi=newi+1;
else
fiti=fiti+1;
end
end
%交叉算子
%随机产生一个概率p,如果p小于交叉概率pc,则随机产生一组自变量x的解q,当q的某一个位置等于1时,交换自变量解nparents中(i+1)和(i)的值。
for i=1:2:pop_size
p=rand;
if p<p_c
q=randi([0,1],1,length);
for j=1:length
if q(j)==1
temp=nparents(i+1,j);
nparents(i+1,j)=nparents(i,j);
nparents(i,j)=temp;
end
end
end
end
%变异算子
%随机产生一个概率r,如果p小于交叉概率pm,变异自变量解nf(m),即如果某一位置为0,则将其变为1。
for m=1:pop_size
for n=1:length
r=rand;
if r<p_mu
if nparents(m,n)==0
nparents(m,n)=1;
else
nparents(m,n)=0;
end
end
end
end
parents=nparents;
parents(i,:)=xBest;
xtrace(k,:)=parents(rr(1,1),:);
trace(k)=Fit(rr(1,1),1);%每一个trace都是迭代中最大价值。
end
yBest
xBest
figure(1)
plot(trace);
xlabel('迭代次数')
ylabel('函数目标值')
title('适应度进化曲线')