配送问题遗传算法解决思路

Apr 9, 2016


1.算法概述

由于数学模型将最大整体满意度与最小成本的双目标函数转化为了最小成本的单目标函数和整体满意度阈值下限约束,所以遗传算法比较适合于解决当前的问题,在暴力枚举的基础上,进行有选择,有趋向的挑选配送方案,使单目标的值趋近于极限值。 此外,区别于常见的遗传算法,本算法的交叉和变异操作针对该问题进行了调整,不再作用于双个体或者变换某基因到其取值范围的其他值。

2.编码方式

当前目标最小成本是连接所有需求点的路线的成本之和,所以需要在基因中体现线路,即以路线经过的需求点的序列为一条染色体。犹豫地点编号的取值范围是一个小于n的自然数集合,非连续,非负,且取值区间并不大,所以字符编码方式更为适用。 例如,[0,1,2,0,3,0],意即该方案共有两条路径,一条路径从配送中心出发,经过编号为1,2的需求点并服务之后返回配送中心,另一条路径从配送中心出发,经过编号为3的需求点并服务后返回配送中心。

3.选择方式

根据各个染色体的生存概率,通过轮盘赌算法选择出一个染色体进行下一步操作。 伪代码如下:

设当前总适应度为F=0
产生一个(0,1.0]的随机数random
遍历所有染色体:
    取得当前染色体的适应度f
    F = F + f
    如果 F >= random 那么 当前染色体被选中,返回选择结果

由于轮盘赌本质上是基于一个随机数机制,所以很有可能优秀的个体并没有遗传到下一代中,所以,这里结合了精英选择策略以缓解这种缺点造成的影响,在每一次的迭代中,都会比较并更新史上最高适应度的节点,当新一代个体产生完毕后,用史上最高适应度的节点替换掉当前群体中最低适应度的节点,以保留优秀基因。

4.交叉操作

对于常见的交叉操作,是对于选中的两个染色体,以某种策略交换其相同区间内的基因,但是对于本问题,这种操作并不适用,因为问题约束了一个方案中一个需求点只能被服务一次,从配送中心出发后,也必须服务至少一个点,否则无意义,路线以配送中心开始,也以配送中心结束,所以,要求方案中不能有除0之外的重复数字,不允许连续有两个0出现,并且必须以0开始并结尾, 如果使用常见交叉操作例如多点交叉,均匀交叉等,产生不可行解得概率相当大,因此需要对交叉操作特殊设计。 交叉操作的意义在于大概率变化染色体,以扩大搜索范围,所以,这里需要使一条染色体得以大幅度的变化,调整线路经过的需求点即可满足需求,伪代码如下:

已知交叉概率Pc,染色体长度n
产生一个(0,1.0]的随机数random
遍历第i,i∈(1,n/2]的个基因:
	如果Pc > random则执行以下操作:
		交换第i和第i+n/2个基因
检查操作后的染色体是否可行
如不可行,重新上述步骤
如可行,返回交叉后的结果

这样的操作方式既完成了交叉操作需要进行的大范围交换,也保证了产生可行解的概率

5.变异操作

对于常见的变异操作,是对于一条染色体中的一个或多个基因的值进行变换,对于当前问题,由于存在在交叉操作中提到的严格约束,所以并不适用。 变异操作的意义在于小幅度更改基因序列,使该基因的适应度得以接近极限值,所以,这里需要对一条染色体进行微量调整,既要产生变化,也不能让变化过大,合并或拆解线路不会对需求点的经过顺序造成变化,又能对适应度产生影响,伪代码如下:

已知变异概率Pm,染色体长度n
产生一个(0,1.0]的随机数random
遍历所有基因:
	如果Pm > random则执行以下操作:
		如果该基因为0,则去掉这个基因,使两条线路合并
		如果该基因非零,则在该点插入基因0,是两条线路拆解
检查操作后的染色体是否可行
如不可行,重新上述操作
如可行,返回变异后的结果

这样的操作方式既完成了变异操作需要的小范围调整,也保证了可行解的产生概率

6.算法优化

在一般的遗传算法中,如果只是迭代执行选择,交叉,变异操作,而不对其进行约束的话,容易产生诸如局部最优解,退化等问题,影响了结果的准确性和算法的效率,所以,我们需要对算法的迭代过程进行约束。 对于局部最优解的抑制,这里采用的方式是适应度尺度变换,在遗传算法中,各个个体被遗传到下一代群体中的概率是有该个体的适应度来确定的,所以,在算法运行初期,如果出现了超级个体,其适应度远远大于其他个体,就会造成其遗传概率极大,导致其他个体灭绝,出现局部最优解,在算法运行后期,由于各个个体的适应度都比较接近,个体之间无竞争,导致搜索空间进入局部范围,产生局部最优解,因此,在算法运行的不同时期,我们需要对个体适应度进行尺度变化,比如在算法初期,使个体的适应度趋近平均适应度,减少差距,保护弱势个体,在算法运行的后期,使个体的适应度远离平均适应度,拉大差距,扩大搜索空间。 这里对于算法初期,后期的界定,处于复杂度考虑,使用了定值,而不是在迭代中监视群体质量进行动态调整,这个定值目前取在迭代总次数的三分之二,即前三分之二的迭代时间是抑制适应度差距,后三分之一的迭代时间是增加适应度差距 对于退化的抑制,这里采用的方式是解空间限定法,对于每一条染色体(即一个解),每一次交叉或变异操作改变其基因序列后,都会对其可行性进行验证,如不可行,会重新执行操作,确保每次迭代出的新染色体都是可行解,确保了群体不会因为存在大量不可行解造成的退化,

7.算法流程

如流程图所示,根据给定的参数,算法通过选择,交叉,变异等操作将一代种群进化到下一代中,在迭代期间,会对每一次操作的结果验证可行性,会根据当前迭代的阶段对所有个体的适应度进行缩放,当满足迭代次数之后,离开循环,返回结果。