genetic algorithm,美国Holland教授创立,基于达尔文进化论和孟德尔的遗传学说。遗传算法类比了生物界中自然选择、交叉、变异等自然进化方式,利用数码串类比染色体,通过选择、交叉、变异等遗传算子模拟生物的进化过程。
1.编码 伪代码:
2.产生初始群体 Choose initial population
3.计算适应度 Evaluate the fitness of each individual in the population
4.while(条件不满足时)do Repeat
(1)选择 Select best-ranking individuals to reproduce
(2)交叉 Breed new generation through crosssover and
(3)变异 mutation and give the birth to offspring
(4)计算适应度 Evaluate the individual fitness of the offspring
end do Replace worst ranked part of population with offspring
Until (terminating condition)
初始化GA算法参数:number of population、maxinteraction、交叉概率Pc、变异概率Pm
随机生产初始种群
当没有达到终止条件,开始迭代:
计算每个个体的适应度;
遗传算子:
对个体的适应度进行求和,根据以下公式计算每个个体在种群中的比例;
对每个个体的比例进行累加求和,作为选择的概率
随机生成从小到大排序的0-1之间的随机数
如果生成得随机数小于某个个体的选择概率,则选择该个体作为进行繁殖下一代;
交叉算子function(newpop)=crossover(pop,Pc)
循环步长设置为2,选择两个相邻的个体;
随机生成0-1之间的随机数,用来判断是否进行交叉操作;
如果生成得随机小于交叉概率,则进行交叉
单点交叉:随机选择一个交叉点,对两条基因进行交叉
将两个父代染色体上交叉点位置之后的基因字符串进行互换;
newpop1(i,:)=【pop(i,1:crosspoint),pop(i+1,crosspoint:pop-y)】
newpop2(i,:)=【pop(i+1,1:crosspoint),pop(i,crosspoint:pop-y)】
如果生成的随机数大于Pc,则不进行交叉;
变异算子function(newpop)=mutation(pop,Pm)
对于每个个体i进行循环,判断是否进行变异
随机生成0-1之间的随机数
如果生成的随机数小于变异概率,则进行变异操作
随机选择变异位置
将变异位置对应的二进制数进行反转运算;
if pop(i,mutationpoint)==0
newpop(i,mutationpoint=1)
else
newpop(i,mutationpoint)=0
如果生成的随机数大于Pm,则不进行变异
计算后代中个体的适应度;
用后代替换种群中适应度差的个体
直到达到终止条件,结束循环,输出最优值
优点 | 缺点 | |
二进制编码 | 二进制解码、编码操作简单,便于交叉和变异的实现 | 变化程度较小,易陷入局部最优 |
符号编码 (整数编码) |
||
浮点数编码 | 适合表示范围较大的数,适用于精度较高的遗传算法 | |
格雷编码 |
GA算法的搜索能力主要考选择算子和交叉算子,由于变异概率一般在0.001-0.1之间,所以变异只是保证了算法能搜索到的问题解的空间的每一点,从而使算法具有了全局性。
优胜劣汰的过程:选择适应度优的个体。方法:轮盘赌、锦标赛、精英策略
(1)轮盘赌
具体操作如下:
(1)计算出群体中每个个体的适应度f(i=1,2,…,N),N为群体大小;
(2)计算出每个个体被遗传到下一代群体中的概率;
%选择算子
Function [newpop]=selection(pop,fitnessvalue)
构造轮盘赌
[px,py]=size(pop);
totalfitvalue=sum(fitvalue);%对每个个体的适应度求和
p_fitvalue=fitvalue/totalfitvalue;%计算出每个个体被遗传到下一代群体中的概率
p_fitvalue=cumsum(p_fitvalue);%计算出每个个体的累积概率
ms=sort(rand(px,1));%rand均匀分布的随机数;由随机数组成的 NP×1 向量ms为0-1的随机数,从小到大排列的NP个数
fitin=1;
newin=1;
while newin<=px
if (ms(newin))
newpop(newin,:)=pop(fitin,:);
newin=newin+1;
else
fitin=fitin+1;
end
end
选择两个父代,然后在染色体随机选择一个交叉点,两个父代交叉点后的片段进行互换;
交叉开始随机产生随机数与交叉概率进行比较,若随机数小于交叉概率,则进行交叉。
% 交叉算子 交叉概率一般为60%-70% 每个个体之间都以一定的概率 pc 交叉,即两个个体从各自字符串的某一位置
function [newpop_cross]=crossover(pop,pc)
[px,py]=size(pop);
newpop_cross=ones(size(pop));
for i=1:2:px-1 %步长设置2,相邻的两个个体进行交叉
if(rand
crosspoint=round(rand*py);%随机生产交叉点,对两条基因进行交叉
newpop_cross(i,:)=[pop(i,1:crosspoint),pop(i+1,crosspoint+1:py)];
% pop(i,:)表示提取矩阵的第i整行 pop(i,1:c)表示提取矩阵pop的第一行 1-c列
newpop_cross(i+1,:)=[pop(i+1,1:crosspoint),pop(i,crosspoint+1:py)];
else
newpop_cross(i,:)=pop(i,:);%不进行交叉 直接返回父代
newpop_cross(i+1,:)=pop(i+1,:);
end
end
%% 对每条染色体执行基本位变异操作
%输入变量:二进制种群pop 变异概率pm
%输出变量:选择之后的二进制种群newpop_mutation
function [newpop_mutate]= mutation(pop,pm)
[px,py]=size(pop);
newpop_mutate=ones(size(pop));
for i=1:px
if rand(1)
mutatepoint=round(rand(1)*py);% 选择变异的位置
% 将对应基因位置的二进制数反转
if(mutatepoint==0)
mutatepoint=1;
end
newpop_mutate(i,:)=pop(i,:);
if newpop_mutate(i:mutatepoint)==0
newpop_mutate(i,mutatepoint)=1; %将对应基因位置的二进制数反转
else
newpop_mutate(i,mutatepoint)==1;
newpop_mutate(i,mutatepoint)=0;
end
else
newpop_mutate(i,:)=pop(i,:);
end
end