数学建模-遗传算法模型

遗传算法(Genetic Algorithm, GA)起源于对生物系统所进行的计算机模拟研究。它是模仿自然界生物进化机制发展起来的随机全局搜索优化方法,借鉴了达尔文的进化论和孟德尔的遗传学说。其本质是一种高效、并行、全局搜索的方法,能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应地控制搜索过程以求得最佳解。

相关术语:

基因(genotype)

性状染色体的内部表现
表现型(phenotype) 染色体决定的性状的外部表现,或者说,根据基因型形成的个体的外部表现
进化(evolution) 种群逐渐适应生存环境,品质不断得到改良。生物的进化是以种群的形式进行的
适应度(fitness) 度量某个物种对于生存环境的适应程度
选择(selection) 以一定的概率从种群中选择若干个个体。一般,选择过程是一种基于适应度的优胜劣汰的过程
复制(reproduction) 细胞分裂时,遗传物质DNA通过复制而转移到新产生的细胞中,新细胞就继承了旧细胞的基因
交叉(crossover) 两个染色体的某一相同位置处DNA被切断,前后两串分别交叉组合形成两个新的染色体。也称基因重组或杂交
变异(mutation) 复制时可能(很小的概率)产生某些复制差错,变异产生新的染色体,表现出新的性状
编码(coding) DNA中遗传信息在一个长链上按一定的模式排列。遗传编码可看作从表现型到基因型的映射
解码(decoding) 基因型到表现型的映射
个体(individual) 指染色体带有特征的实体
种群(population)

个体的集合,该集合内个体数称为种群的大小

遗传算法的概念

 模拟物竞天择的生物进化过程,通过维护一个潜在解的群体执行了多方向的搜索,并支持这些方向上的信息构成和交换。是以面为单位的搜索,比以点为单位的搜索,更能发现全局最优解

比喻说明:在遗传算法中,有很多袋鼠,它们降落到喜玛拉雅山脉的任意地方。这些袋鼠并不知道它们的任务是寻找珠穆朗玛峰。但每过几年,就在一些海拔高度较低的地方射杀一些袋鼠,并希望存活下来的袋鼠是多产的,在它们所处的地方生儿育女。就这样经过许多年,这些袋鼠们竟然都不自觉地聚拢到了一个个的山峰上,可是在所有的袋鼠中,只有聚拢到珠穆朗玛峰的袋鼠被带回了美丽的澳洲。

遗传算法的理解

 遗传算法的实现过程实际上就像自然界的进化过程那样。首先寻找一种对问题潜在解进行“数字化”编码的方案。(建立表现型和基因型的映射关系)然后用随机数初始化一个种群(那么第一批袋鼠就被随意地分散在山脉上),种群里面的个体就是这些数字化的编码。接下来,通过适当的解码过程之后(得到袋鼠的位置坐标),用适应性函数对每一个基因个体作一次适应度评估(袋鼠爬得越高,越是受我们的喜爱,所以适应度相应越高)。用选择函数按照某种规定择优选择(我们要每隔一段时间,在山上射杀一些所在海拔较低的袋鼠,以保证袋鼠总体数目持平)。让个体基因变异(让袋鼠随机地跳一跳)。然后产生子代(希望存活下来的袋鼠是多产的,并在那里生儿育女)。遗传算法并不保证你能获得问题的最优解,但是使用遗传算法的最大优点在于你不必去了解和操心如何去“找”最优解。(你不必去指导袋鼠向那边跳,跳多远)而只要简单的“否定”一些表现不好的个体就行了。(把那些总是爱走下坡路的袋鼠射杀,这就是遗传算法的精粹

遗传算法基本过程

  • 初始化:设置最大迭代进化次数T,随机生成M个个体作为初始种群P(0);
  • 个体评价:计算当前种群P(t)中的个体适应度;
  • 选择:在个体评价之后,对群体进行选择操作目的是将优秀个体的基因通过组合配对交叉遗传到下一代种群中;
  • 交叉:遗传算法中的核心部分;
  • 变异:在个体基因的基础上进行变动,模拟自然界的基因突变,其变异结果的好坏不定;
  • 终止条件:若迭代次数达到预先设定的T,将迭代过程中具有最优适应度的个体作为问题的解输出。

遗传算法具体步骤分析

遗传算法的核心是个体之间的组合交叉变异部分。个体之间的组合交叉变异方式众多,不同的交叉变异方式将对算法的效率产生巨大的影响。

选择

  • 适应度比例方法,例如轮盘赌选择算法
  • 随机遍历抽样
  • 局部选择

       其中轮盘赌选择算法是最简单也是最常用的选择算法之一。该方法中各个个体被选择的概率和其适应度成正比。个体的适应度越高,其被选择到的概率越大。

交叉

  • 实值重组:离散重组、中间重组、线性重组、扩展线性重组
  • 二进制交叉:单点交叉、多点交叉、均匀交叉、洗牌交叉、缩小代理交叉

       其中单点交叉是最常用的交叉算法。在操作时首先设定一个交叉点,将两个个体在该点之后的基因结构进行互换,从而形成两个新的个体。例如: 
个体A:1 0 0 1 1 1 1 → 1 0 0 1 0 0 0 新个体 
个体B:0 0 1 1 0 0 0 → 0 0 1 1 1 1 1 新个体

变异

  • 实值变异
  • 二进制变异

       遗传算法引入变异的目的有两个:一是使遗传算法具有局部的随机搜索能力。当遗传算法通过交叉算子已接近最优解邻域时,利用变异算子的这种局部随机搜索能力可以加速向最优解收敛。显然,此种情况下的变异概率应取较小值,否则接近最优解的积木块会因变异而遭到破坏。二是使遗传算法可维持群体多样性,以防止出现未成熟收敛现象。此时收敛概率应取较大值。

遗传算法与传统优化算法的区别

  • 遗传算法的初始解设置为一个群体,搜索覆盖面广,不易陷入局部最优;
  • 变异部分使得算法有一定概率跳出局部最优;
  • 遗传算法可同时对多个可行解进行实用性评估,算法容易并行;
  • 具有自组织、自适应、自学习性。算法利用自身组织架构进行搜索,适应度大的个体具有较高存活率,指导了最优解的搜索方向。

算法的应用

  • 旅行商问题(Traveling Salesman Problem,TSP):TSP是最基本的路线问题,该问题是在寻求单一旅行者由起点出发,通过所有给定的需求点之后,最后再回到原点的最小路径成本。
  • 指派问题(Assignment problem):在满足特定指派要求条件下,使指派方案总体效果最佳。如:有若干项工作需要分配给若干人(或部门)来完成。
  • 单车间调度问题(Job-shop scheduling problem, JSP)是最基本最著名的调度问题,也是NP难问题,无最优解精确算法。一般类型的JSP问题可表达为:n个工件在m台机器上加工,每个工件有特定的加工工艺,每个工件加工的顺序及每道工序所花时间给定,安排工件在每台机器上工件的加工顺序,使得某种指标最优。
  • 运输问题:为了把某种产品从若干个产地调运到若干个销地,已知每个产地的供应量和每个销地的需求量,如何在许多可行的调运方案中,确定一个总运输费或总运输量最少的方案。
  • 背包问题(Transportation problem):给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。
  • 设施选址问题(Facility Location Problem):指在给定的若干位置中选择一些来建立设施使得所有顾客的需求得到满足,且总体费用最小。
  • 图划分问题(Graph Partitioning Problem):将图中的节点划分为数量大致相等的若干个分区,使得两个顶点分别在不同分区的边的数量最小化。
  • 图着色问题:对于n个顶点的无环图G,要求对其各个顶点进行着色,使得任意相邻的顶点都有不同的颜色,且所用颜色种类最少。

遗传算法的MATLAB实现

clc
clear all
close all
lbx=-1;ubx=1; %函数自变量x范围[-1,1]
lby=-1;uby=1; %函数自变量y范围[-1,1]
% 定义遗传算法参数
NIND=50; %个体数目
MAXGEN=50; %最大遗传代数
PRECI=20; %变量的二进制位数
GGAP=0.90; %代沟
px=0.97; %交叉概率
pm=0.001; %变异概率
trace=zeros(6,MAXGEN); %寻优结果的初始值
FieldD=[PRECI PRECI PRECI PRECI PRECI;lbx lby lbx lbx lbx;ubx uby ubx ubx ubx;1 1 1 1 1;0 0 0 0 0;1 1 1 1 1;1 1 1 1 1];  %区域描述器
Chrom=crtbp(NIND,PRECI*5);  %初始种群
% 优化
gen=0;  %代计数器
XY=bs2rv(Chrom,FieldD);  %计算初始种群的十进制转换
d1=XY(:,1);
d2=XY(:,2);d3=XY(:,3);d4=XY(:,4);d5=XY(:,5);
ObjV=func(d1,d2,d3,d4,d5,NIND);  %计算目标函数值
while gen<MAXGEN
   FitnV=ranking(-ObjV);   %分配适应度值
   SelCh=select('sus',Chrom,FitnV,GGAP);  %选择
   SelCh=recombin('xovsp',SelCh,px);  %重组
   SelCh=mut(SelCh,pm);  %变异
   XY=bs2rv(SelCh,FieldD);  %子代个体的十进制转换
   d1=XY(:,1);d2=XY(:,2);d3=XY(:,3);d4=XY(:,4);d5=XY(:,5);
   d1n=numel(d1);
   ObjVSel=func(d1,d2,d3,d4,d5,d1n);  %计算子代的目标函数值
   [Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新种群
   XY=bs2rv(Chrom,FieldD);
   gen=gen+1   %代计数器增加
   %获取每代的最优解及其序号,Y为最优解,I为个体的序号
   [Y,I]=max(ObjV);
   trace(1:5,gen)=XY(I,:);   %记下每代的最优值
   trace(6,gen)=Y;   %记下每代的最优值
end
figure(2);
plot(1:MAXGEN,trace(6,:));
grid on
xlabel('遗传代数')
ylabel('解的变化')
title('进化过程')
bestc1=trace(1,end)
bestc2=trace(2,end)
bestc3=trace(3,end)
bestc4=trace(4,end)
bestc5=trace(5,end)
bestSIR=trace(6,end)

猜你喜欢

转载自blog.csdn.net/weixin_37079656/article/details/86561330