应用遗传算法(GA)的实操步骤

应用遗传算法(GA)的实操步骤

说起遗传算法(GA),大抵搞运筹学的亲们都比较熟悉。经过多年的发展,GA算法日益完善,在各个领域也有广泛应用。虽然,在原有场景下,GA不断被新的算法所“置换”,但是作为经典算法,且较于其他算法稳定,常用于建模学习。
对于一个运筹学问题,一般是规划类问题,常常以“数学公式”(目标函数和约束方程)的方式进行表达。

对于一个实际问题,我更倾向于先把实际问题理解清楚,而非直接去观察方程。虽然方程更加严谨,但是不便于理解。
用GA方法求解问题,我总结成以下步骤:

  1. 编码
    实际上,个人认为,把编码掌握,就可以说问题解决了一半。
    a) 被编码的部分,应该是参与决策的自变量部分(额,更加准确的说法是“决策变量”,科普文不要在意这些细节)。
    一个简单的例子。选址问题。
    例1:假设在一个有范围的二维平面内随机生成m个点(m>0),记做 p 1 , p 2 , . . . , p i , . . . p m p_1,p_2,...,p_i,...p_m p1,p2,...,pi,...pm,我们需要在这些点中选择n个(n是确定的值,0<n<m, 且n!=1),记做 s 1 , s 2 , . . . s j , . . . , s n s_1,s_2,...s_j,...,s_n s1,s2,...sj,...,sn,
    定义dist(p_i, s) = min(d(p_i, s_j)) for j = 1…n,其中min表示最小值,d(x,y)表示两点之间的欧式距离,使得sum(dist(p_i, s) for i = 1…m)最小的s.

此问题在实际问题中是有背景意义的。假设有100个配送点,现要从这些配送点中选择10个作为配送中心,其他配送点选择从最近的配送中心拿货,如何选择配送中心使得其他配送点到配送中心之间的距离之和最小。
这其实是同一个问题。
我们来看,我们要找的是一些点集(s),所以,我们需要对s进行编码。如果对p进行编码,也不是不可以,还是能出结果,毕竟,显然s是p的子集,但是效果就差一些。

b) 编码的选择上需要斟酌
在GA中,一共有3种编码方式–二进制编码(也叫01编码),整型编码(也叫整数编码),实型编码(也叫小数编码)。
按前例例1,我们就可以选择整型编码,确定编码长度是n,编码范围是1到m之间的整数值,且互不相等。而,如果上例例1错用做对p编码,此处必然会选择二进制编码,编码长度为m,编码范围是{0, 1}。
此时,我们还必须加入约束条件,使得编码之和等于n。编码错误的弊端凸显–既增加了编码量,又对约束更加苛刻。

再例如
例2:假设在一个有范围的二维平面内随机生成m个点(m>0),记做 p 1 , p 2 , . . . , p i , . . . p m p_1,p_2,...,p_i,...p_m p1,p2,...,pi,...pm,我们重新生成n个(n是确定的值,0<n<m, 且n!=1),记做 s 1 , s 2 , . . . s j , . . . , s n s_1,s_2,...s_j,...,s_n s1,s2,...sj,...,sn,
定义dist(p_i, s) = min(d(p_i, s_j)) for j = 1…n,其中min表示最小值,d(x,y)表示两点之间的欧式距离,使得sum(dist(p_i, s) for i = 1…m)最小的s.

此问题在实际问题中也是有背景意义的。假设有100个配送点,现欲新建10个配送中心,配送点选择从最近的配送中心拿货,如何选择配送中心使得其他配送点到配送中心之间的距离之和最小。

这里我们既然是新建点,和例1的选择有所不同。我们就需要从m个点的取值范围着手,使用实型编码,编码的长度是n,编码的范围是个m点的取值范围。因为实型编码很难重复,所以重复约束不做考虑。

再如,
例3:假设在一个有范围的二维平面内随机生成m个点(m>0),记做 p 1 , p 2 , . . . , p i , . . . p m p_1,p_2,...,p_i,...p_m p1,p2,...,pi,...pm,我们选择n个(n是不确定的值,0<n<m, 且n!=1),记做 s 1 , s 2 , . . . s j , . . . , s n s_1,s_2,...s_j,...,s_n s1,s2,...sj,...,sn,
定义dist(p_i, s) = min(d(p_i, s_j)) for j = 1…n,其中min表示最小值,d(x,y)表示两点之间的欧式距离,使得sum(dist(p_i, s) for i = 1…m)最小的s.

显然,n趋于m的时候,距离之和趋于0。在实际情况中,往往以其他约束方式进行限制(比如,建设配送中心的成本等),此处只讨论编码。这里,编码就用二进制编码为宜,类似于例1中的编码方法,编码长度为m,编码范围是{0, 1}。再另加约束。
如果此时,我们采用整型编码,就需要确定可能存在的最大编码长度,再引入无效的编码,比如编码0,不对应任何一p(配送点)。这里的编码难度比较大,无效编码较多稍逊色与二进制编码。

  1. 评价函数的处理
    评价函数,直接决定种群的进化方向。如果说编码使用不佳会导致迭代次数增加,那么评价函数错直接导致结果不正确。我们从目标函数和约束两个方向进行讨论。
    a) 目标函数
    首先,目标函数并不等同于评价函数。我之前在学习的过程中,曾经混淆过这两个的概念。如今看来,目标函数与评价函数相差的有两点–一是,评价函数比目标函数多了一些约束;二是,评价函数可以做近似计算。
    第一点毋庸置疑,第二点着重强调,因为有可能目标函数过于复杂,计算量大,做近似计算的话,如果函数趋势相同或者近似,在求解精确程度影响不大的基础上提高算法效率,何乐不为。
    在这一方面,可以类比“果蝇”算法–这个算法过于特殊,以至于每次回想起来总有“这个东东怎么可以这样去写”的感叹。
    不过,虽说可以近似,在实际中,近似函数比较难以操作,普遍的做法,目标函数是肯定要写进评价函数里面的。当然,写起来还是有技巧:
    如果使用的框架是“评价函数得到取值越高,个体越优”的策略,可是你的目标是求最小值,那么不妨把目标函数取相反数,变为与框架相符的策略;
    如果使用的框架是“评价函数得到取值越高,个体越优”的策略,可是你的目标是越接近某值(我们假设这个值是y’吧),那么不妨评价函数设为1/|y-y’|(y是把编码对应的决策变量带入评价函数所得到的值,|.|代表绝对值),变为与框架相符的策略。
    当然,聪明的你可能也想到了其他的方案,只要能把函数映射到你所需要的域就可以。

b) 约束方程
对于约束方程,着实是个比较头痛的问题。解决起来,不仅需要经验,有时候甚至需要一些灵感。经验之谈,在此分享,若有其他思路,也欢迎讨论。
首先,部分约束在编码的时候已经体现过了,就无需写进评价函数。这个约束体现在编码的长度,编码的取值范围了。
次之,有些约束体现在了新种群的生成策略上,也不需要写进评价函数。新种群的生成策略,就包含了变异,交叉等。低三部分着重展开。
最后,剩下的约束影响评价函数。
而影响评价函数的这部分,也有以下情况
一是无效的编码。无效的编码或许会写成惩罚函数,返回得到一个其他正常编码所对应的评价函数到不了的极差值。
二是按权重影响。比如,在“评价函数得到取值越高,个体越优”的种群中,你可能需要把约束变形乘一个系数减到评价函数中。如果约束比较多,还需要大致确定哪个,或者哪些影响更大一些,这样系数比例也有不同。

需要补充的是,在其他算法中,这两点可能稍有变化,在学习过程中可能不能类比。
如,天牛须搜索算法中,由于没有定义边界,所以如(一)所言的失效编码的极差值不应为一个定值,不然可能导致算法无启发性。或许,这个“极差值”也有所比较
是个目测可行的方案。
再如,禁忌搜索中提供了禁忌表,也可以作为约束处理的方法。

  1. 其他
    实际上,GA作为“老牌”算法,已经框架化了。很多情况下,包括交叉、变异、筛选等操作,并不需要详细讨论。但是,还是一句话,具体问题要具体分析。
    比如,在解决旅行商(TSP)问题的时候,m个城市,如果采用整型编码,编码长度为m,每个染色体是1~m的一个排列,那么在交叉的时候,按照一般方案很可能出现有些节点没走到,有些节点走了多次的情况。
    先在选择点中插入,再去重的策略,来保证“不重不漏”。在变异的时候,也可以采取选择染色体中的一段,再随机排列的手段;或者做染色体易位的操作(类似于生物学上的染色体易位)。
    再如,曹美容提到《O2O模式下生鲜冷链配送路径优化研究》所描述的背景问题,车辆规划路径的时候还需要考虑回到配送中心,那么如果用GA处理的话,就需要用型编码加上0编码做挡板的方式进行处理,不仅要做TSP问题类似的交叉变异方法,还需要讨论两个0并列的时候存在的特殊情况(两个0并列的话意味着有一辆车未送货,与实际不符)。

综上,GA虽然提出时间较久,依然有细节值得探讨与研究。也时间仓促恐有误,欢迎讨论。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

A.Star

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

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

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

打赏作者

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

抵扣说明:

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

余额充值