如何理解遗传算法中的编码与解码?以二进制编码为例

前言

遗传算法的编码方法各种各样,但二进制串编码方式是最经典的一种,那么它的编码和解码该如何进行呢?或许本博客能给你一个具有参考价值的答案。


编码

经典遗传算法中使用“染色体”来代指个体,它由二进制串组成,如下图所示:

它的每一维称为一个基因,取值为0或1。



下面用一个具体的优化问题来解释个体(染色体)的编码和解码:

m a x m i z e   f ( x )   =   − x 2 + 10 cos ⁡ ( 2 π x ) + 30 ,   − 5 ≤ x ≤ 5 maxmize \ f(x)\ =\ -x^2+10\cos{(2\pi x)}+30,\ -5\le x \le 5 maxmize f(x) = x2+10cos(2πx)+30, 5x5

对于上述待优化函数,我们的编码应该设置多长的二进制串呢?

我们首先明确,编码长度取决于自变量的范围(更准确点应该是决策变量的范围)搜索精度,所以围绕它们来考虑如何编码。

在本例,我们假设精度是0.01,记清楚了,是 0.01

首先,我们可以确定自变量的范围(更准确点应该是决策变量的范围)是5-(-5)= 10.

另外,我们需要的精度是0.01,也就是说我们要能用我们的编码把自变量范围1010.00表示,但二进制串只能表示整数没法表示小数(其实可以表示小数的,但我们不讨论这种情况),所以我们换个思路,我们用1000来表示10.00,但请注意,二进制串转化为十进制时不能刚好得到1000,而是得到 2 n 2^n 2n,所以我们得找到一个最大值大于1000的二进制串。
在这里插入图片描述
根据上图,我们发现可以用长度为10的二进制串来“容纳”上述的1000,为什么我用“容纳”来表述呢?因为长度为10的二进制串可以表示 0 ∼ ( 2 10 − 1 ) 0 \thicksim (2^{10}-1) 0(2101),也就是 0 ∼ 1023 0 \thicksim 1023 01023,有 1023 > 1000 1023>1000 1023>1000;而 0 ∼ ( 2 9 − 1 ) 0 \thicksim (2^{9}-1) 0(291) 0 ∼ 511 0 \thicksim 511 0511, 有 511 < 1000 511<1000 511<1000 ,所以用1023来表示10.00,编码时二进制串长度为10,而不是9

由上图公式,我们把初始群体的每个个体用一个长度为10的二进制串来表示,记为:
A 10 A 9 A 8 . . . A 3 A 2 A 1 A_{10}A_{9}A_{8}...A_{3}A_{2}A_{1} A10A9A8...A3A2A1

解码

在上一小节我们用1023来表示10.00,那解码的时候表示1023的二进制串如何表示回10.00呢?

想想,我们编码时把10.00放大成1023,那么解码时缩小1023倍就行了!

这样,我们解码的时候做如下处理:
在这里插入图片描述
10.00 /10230.009775,我们把解码出来的十进制数都乘以0.009775,就得到了最终结果。

于是有:

其中 L x = − 5 L_x = -5 Lx=5

x x x 就是解码所得十进制数。

补充

这里要稍微注意下,实际搜索精度与期望搜索精度之间是存在误差的:

我们本想用1000来表示10.00的,但由于二进制串只能表示 2 n 2^n 2n,所以只好用1023来表示10.00,之后在

这里没法除尽产生了误差。







参考资料:
《人工智能及其应用第五版》- 蔡自兴

  • 25
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

猫咪钓鱼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值