详解遗传算法与生产作业调度

🍎道阻且长,行则将至。🍓


一、遗传算法🌱

根据遗传学的理论,生物的进化发展来源于三大动力:自然选择、遗传和突变。自然选择就是自然环境对不同表现型生物有不同的影响,使用适应度来度量这种影响,适应度较好的生物个体对环境亲和力较高,有较大的几率可以存活下来,而适应度较差的容易被淘汰。遗传是指亲子之间或子代之间存在着相似的特点,由现代的遗传分子学说证明性状是由染色体上基因编码表达,适应度较高的个体基因编码可以更容易传递到下一代。变异则是染色体的基因编码发生异于父本的改变,导致性状发生改变,由于变异的不确定性,通常会带来不好的结果。遗传保证了生物的稳定性,变异促进了生物的多样性,在自然选择的作用下使生物能够不断进化发展。

而对于许多复杂的问题,例如函数优化和组合优化等,随着规模的扩大,约束的增加,问题变得更加复杂,以至于无法找到一种数值计算方法,那么如何在这样复杂的搜索空间寻求最优解。20世纪70年代美国密歇根大学John Holland等提出遗传算法,主要方法是模拟自然选择的演化过程构造人工系统模型,将问题的解作为一个个体进行合适的编码,将所有的编码抽象为一个种群,在种群内逐代进行选择、交叉、变异操作,以筛选出最优个体。

1.遗传算法简介

遗传算法就是对自然界生物演化的模拟,“物竞天择,适者生存…”我们都知道遗传学知识中有种群、个体、基因等,那么在遗传算法中同样也存在。
种群:自然界中生物一般以种群为单位生存,种群的大小表示问题解的规模。
个体:种群中单个生物由于基因的差别,表现出的性状也不一样,把个体作为算法中问题的解。
染色体、DNA、RNA:一种链状的有规则的编码结构。
基因:控制某种性状的编码片段。
遗传算法是模拟生物遗传过程,对待求问题进行分析,把所有解的集合视为一个种群,对问题的解进行适合的编码随机产生作为个体,设置一定的度量方式来评价每一个个体,自然选择则对应算法的选择操作,根据适应度函数,用一定的方法来选择个体,然后是繁殖后代,对应有算法的交叉和变异操作,随着时间的推进,种群逐渐具备更优良的品质,而达到一种稳定状态,种群中优良个体即为问题的较优解。

2.遗传操作

算法的三个核心计算:选择、交叉和变异0,每个操作也有不同的方案,对于不同的问题可以采取合适的方案来求解。

2.1 选择

通常我们是要挑选较优秀的个体出来,这个操作主要是通过选择概率进行的,而 选择概率和适应度(根据函数计算的结果)有关,因此需要先计算每个个体的适应度。适应度计算之后挑选父代个体,主要方法有:

  • 轮盘赌选择:模拟一种称为轮盘赌的游戏,选择概率与适应度有关:
    将选择概率累加得到累积概率区间,然后随机产生一个概率值,包含在哪个区间范围则说明此次选中哪个个体。因此个体的适应度越高,即表示个体越优秀,选中该个体的概率也越大。
  • 随机遍历抽样:和上一个方法轮盘赌类似,需要计算选择概率和累积概率区间,若种群的个体数目为m,先在01/m中随机产生一个数,此数值所在的区间代表的个体被选中,然后以1/m的距离在区间进行等距离抽样选择。
  • 锦标赛选择:就是挑选一定数量个体参加比赛优者获胜,即随机参考一定数量个体,然后选择其中最好的。
  • 局部选择:以种群中具有一定规则的部分个体为邻集,在这个邻集中选择父代个体。

2.2 交叉

交叉操作模拟生物的基因重组产生新个体,它的操作参数包括交叉的概率、位点和方式。根据编码类型的不同,包括实值交叉重组和二进制交叉重组,其中二进制交叉主要有以下几种方法:

  • 单点交叉:若染色体编码长度为L,则在0~L随机取一个数k,以k为分界线进行交换。
  • 多点交叉:在染色体长度内随机产生指定个,作为本次交叉的交叉点,间隔进行交换。由于交叉的点较多,因此多点交叉的破坏性更强,可以在一定程度上增强算法搜索能力。
  • 均匀交叉:对染色体编码每位以概率进行交换,这种方法类似于多点交叉。

而对于实数编码采用的是模拟二进制交叉方法。

2.3 变异

对个体的编码以较小的概率改变(遗传学中认为突变更可能带来不好的影响),属于局部随机搜索方法,根据编码方式的不同有实值变异和二进制变异。

3.遗传算法流程

  • 步骤一:产生初始种群,使用合适的方式随机产生一定数目的编码;
  • 步骤二:根据适应度函数计算适应度,判断是否符合结束要求,符合则结束并输出结果,否则继续计算;
  • 步骤三:根据适应度按某种选择方法挑选父代个体;
  • 步骤四:交叉,对父代进行交叉操作,生成下一代;
  • 步骤五:变异,对个体的编码进行改变;
  • 步骤六:产生新一代种群后返回步骤二

遗传算法


二、实现遗传算法🌴

遗传算法的主要流程就是编码、选择、交叉、变异,本节以遗传算法优化求解一个函数最大值为例进行实现和分析:在这里插入图片描述

1.编码与初始化

编码是遗传算法的重要一步,编码有问题则后面的工作也无法继续,采取一个合适的编码方式可以有效提高遗传算法的运行效率。编码方式是一种解空间到搜索空间的映射,有浮点数和二进制数两种类型,浮点数编码在求解高精度问题上比较好,同时对复杂的约束条件处理也比较方便,二进制编码相比于浮点数编码具有操作简便的特点,但对于连续函数存在离散化的误差,使用较长的编码串可以提高精确度,可是会使得算法的搜索空间加大,降低遗传算法的性能。对于编码问题Goldberg提出编码评估规范:完备性、健全性和非冗余性。
在本节函数优化中,自变量的范围为[-1,2],精确度为6位,解的空间大小为3106,由于221< 3106 <222, 进行二进制编码需要22位,通过下面的计算方法进行二进制编码:
在这里插入图片描述
选择一个较好地种群规模可以提供遗传算法的运行效果,较小的种群规模可能降低算法的运行性能,而较大的规模可能会增加遗传算法的计算复杂度。初始化方法如下:

void  initpop(){
   
	int  j1 , k1 , m , end;
	unsigned  int g_mask  = 1;
	for (j1 = 0 ; j1 < popsize; j1++){
     //popsize的种群
		for (k1 = 0; k1 < chrom_size; k1++){
    
			oldp[j1].chrom[k1] = 0;
			if (k1 == (chrom_size - 1))
				end = lchrom - (k1 * (8 * sizeof(unsigned int)));
			else
				end = 8 * sizeof(unsigned int);
			for (m = 1; m <= end;m++){
   
				oldp[j1].chrom[k1] = oldp[j1].chrom[k1] << 1;
				if (flip(0.5))
					oldp[j1].chrom[k1] = oldp[j1].chrom[k1] | g_mask;
			}
		}
		oldp[j1].parent[0] = 0; 
		oldp[j1].parent[1] = 0;
		oldp[j1].xsite = 0;
		fun_ob(&(oldp[j1]
  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Super algorithm

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

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

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

打赏作者

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

抵扣说明:

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

余额充值