遗传算法(Genetic Algorithm,GA)-基于MATLAB环境实现

1.GA简介

genetic algorithm,美国Holland教授创立,基于达尔文进化论和孟德尔的遗传学说。遗传算法类比了生物界中自然选择、交叉、变异等自然进化方式,利用数码串类比染色体,通过选择、交叉、变异等遗传算子模拟生物的进化过程。

1.1遗传算法的流程

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,则不进行变异

计算后代中个体的适应度;

用后代替换种群中适应度差的个体

直到达到终止条件,结束循环,输出最优值

  

2.遗传算法分析

2.1编码方法

优点缺点
二进制编码二进制解码、编码操作简单,便于交叉和变异的实现变化程度较小,易陷入局部最优

符号编码

(整数编码)

浮点数编码适合表示范围较大的数,适用于精度较高的遗传算法
格雷编码

2.2GA算法的三种算子

GA算法的搜索能力主要考选择算子和交叉算子,由于变异概率一般在0.001-0.1之间,所以变异只是保证了算法能搜索到的问题解的空间的每一点,从而使算法具有了全局性。

2.2.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))<p_fitvalue(fitin)

newpop(newin,:)=pop(fitin,:);

newin=newin+1;

else

fitin=fitin+1;

end

end

 2.2.2 交叉变换

(1)单点交叉

选择两个父代,然后在染色体随机选择一个交叉点,两个父代交叉点后的片段进行互换;

交叉开始随机产生随机数与交叉概率进行比较,若随机数小于交叉概率,则进行交叉。

% 交叉算子 交叉概率一般为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<pc)

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

 2.2.3基因突变

%% 对每条染色体执行基本位变异操作

%输入变量:二进制种群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)<pm %如果生成的随机数在变异概率内,执行变异操作,否者不进行突变处理

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

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱佩棋(代码版)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值