1. 在所有染⾊体中随机挑选 NP * Pm 个染⾊体进⾏变异
2. 假设挑选出染⾊体h1:11000011
3. 随机挑选 L(染⾊体长度,基因个数) * Pm 个基因进⾏变异
4. 挑选下标:1,2,4
5. h2:00101011(下标1,2,4处基因取反)
代码代码
奇偶交叉GA1
%%%%%%%%%%%%%%%%%%%%标准遗传算法求函数极值%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%初始化参数%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
NP=50; %种群数量
L=20; %⼆进制数串长度
Pc=0.8; %交叉率
Pm=0.1; %变异率
G=100; %最⼤遗传代数
Xs=10; %上限
Xx=0; %下限
f=randi([0,1],NP,L);
%%%%%%%%%%%%%%%%%%%%%%%%%遗传算法循环%%%%%%%%%%%%%%%%%%%%%%%%
for k=1:G
%%%%%%%%%%%%将⼆进制解码为定义域范围内⼗进制%%%%%%%%%%%%%%
for i=1:NP
U=f(i,:);
m=0;
for j=1:L
m=U(j)*2^(j-1)+m;
end
x(i)=Xx+m*(Xs-Xx)/(2^L-1);
Fit(i)= func1(x(i));
end
maxFit = max(Fit); %最⼤值
minFit = min(Fit); %最⼩值
rr = find(Fit==maxFit);
fBest = f(rr(1,1),:); %历代最优个体
xBest = x(rr(1,1));
Fit = (Fit-minFit)/(maxFit-minFit); %归⼀化适应度值
%%%%%%%%%%%%%%%%%%基于轮盘赌的复制操作%%%%%%%%%%%%%%%%%%%
sum_Fit=sum(Fit); %逐列求和
fitvalue=Fit./sum_Fit; %每个元素计算适应度百分⽐
fitvalue=cumsum(fitvalue); %逐列累加适应度百分⽐,求得累积概率
ms=sort(rand(NP,1)); %⽣成排序随机队列
fiti=1;
newi=1;
while newi<=NP %选择完成新群体,
if (ms(newi))<fitvalue(fiti) %当随机队列概率⼩于当前累积概率,则复制该个体为新群体上的新个体,新群体个体序号+1
nf(newi,:)=f(fiti,:);
newi=newi+1;
else %当随机队列概率⼤于等于当前累积概率,则累积概率数组序号+1
fiti=fiti+1;
end
end
%%%%%%%%%%%%%%%%%%%%%%基于概率的交叉操作%%%%%%%%%%%%%%%%%%
for i=1:2:NP %1,3,5...奇数位遍历
p=rand;
if p<Pc %如果⼩于交叉率
q=randi([0,1],1,L); %⽣成1到L的数组,每位上随机取0或1
for j=1:L
if q(j)==1; %若该位上是1,则与i+1上相同位上数进⾏swap
temp=nf(i+1,j);
nf(i+1,j)=nf(i,j);
nf(i,j)=temp;
end
end
end
end
%%%%%%%%%%%%%%%%%%%基于概率的变异操作%%%%%%%%%%%%%%%%%%%%%%%
i=1;
while i<=round(NP*Pm) %迭代数=变异率x总数=变异染⾊体数量
h=randi([1,NP],1,1); %随机选取⼀个需要变异的染⾊体
for j=1:round(L*Pm) %在⼀个染⾊体上随机变异⼀定数量的基因
g=randi([1,L],1,1); %计算随机需要变异的基因在第⼏位
nf(h,g)=~nf(h,g); %将其取反=即是发⽣变异
end
i=i+1;
end
f=nf;
f(1,:)=fBest; %保留最优个体在新种群中