遗传算法的二进制编码

假设我们要用遗传算法求解某个函数的最大值,x的取值范围是[-3.0,12.1],那么我们现在就是要从这个取值范围内取出一些x来作为种群的个体,要取出多少个x这取决于你想要种群有多少个体,即种群规模。

如果我们用十进制去表示种群中的个体,并且如果设定种群规模为10个个体,那么很简单,只要在-3.0到12.1这个区间随机选择10个非重复的实数即可。但是现在我们想用一个二进制去表示种群中的一个个体,该怎么做呢?

首先一个直观的想法是直接找到十进制对应的二进制,但是如果是那样做就涉及到有符号的二进制数了。

所以我们换个思路,使用无符号的二进制数,虽然无符号的二进制数只能表示正数,但是我们可以将这些正数转换到我们想要的区间。

前面说了,只要在-3.0到12.1这个区间随机选择10个非重复的实数即可,但是这里有个精度的问题,如果精度为1的话,那么-3到12大概只有15个数,从15个数中随机选择10个数,那也太不随机了吧,假设我的种群规模是100呢,怎么从15个数中随机选择100个数?因此要增加精度,比如说,如果精度为10000话,那么原先的一个单位长度就被切分成10000份,原先精度为1的区间只有15.1个数,而现在精度为10000的区间就有151000个数,即15.1*10^4。

那么我们使用二进制编码跟使用实数编码道理一样,如果我们需要精度为10000,那么也就需要151000个数来表示这个区间,实数编码你要根据你需要的精度将连续的区间离散化,然后再从离散的数据中随机抽取。二进制编码也是一样,也就是说现在你需要151000个二进制数来表示这个区间内离散的数,然后如果你种群规模是100,那就是从151000个二进制数里面随机抽取100个二进制数成为你的种群。

二进制的位数越多能表示的数越多,所以我们必要先计算一下使用多少位数的二进制。其实对于一个[L,U]的区间,如果精度设定为10^4,需要满足:

2^(n-1) < (U-L)*10^4 <= 2^n  -1

我觉得这样表示也可以:2^(n-1) < (U-L)*10^4 < 2^n  

这是什么意思呢?首先我们要知道对于一个n位的无符号二进制数能表示0~2^n - 1,比如说8位二进制数能表示的数是0-255,也就是说总共能表示256个数,这并不难记,因为10000 0000 就是2^8,而这个数上一个数就是1111 1111,这正好是8位二进制数能表示的最大的数,即255,所以我们很容易能记住一个n位的无符号二进制数能表示0~2^n - 1。

一个n位的无符号二进制数最多能表示2^n个数,所以说不能超过2^n,同理可得,不能低于2^(n-1),因为如果你低于2^(n-1),那么你为什么不直接用(n-1)位表示呢,却要浪费位数呢?

由于2^18 = 262144, 2^17 = 131072, 151000正好介于这两个数之间,所以应该使用18位二进制数。我们可以顺便验证一下,如果使用16位二进制数,16位二进制数最多只能表示2^16 = 65535个数,而我们现在需要151000个数,如果使用19位二进制数,19位二进制数最多只能表示2^19 = 524288,显然没有必要浪费位数,我们不需要那么高精度。

于是接下来我们要从这0-262143这个范围内抽取一定的数作为种群的个体,假设种群规模是100,那就是从中抽取100个个体,值得一提的是其实我们只要151000个数来表示这个区间就已经满足我们的精度了,然而现在却有262144个数,这没有关系,因为一方面多多益善,越多数精度越高,另一方面二进制的位数能表示的数就是这样。

假设种群规模是100,前面我们已经说了,从262144个二进制数里面抽取100个二进制数作为我们的种群(随机生成100个18位二进制数的方式),那么问题又来了,得到的这100个二进制数如何转换到[-3,12.1]这个区间?首先我们要知道,这262144个二进制数转成十进制数是0-262143,我们要从这里面随机抽取100个数。

于是我们就必须要思考:从0-262143中抽取1个数,如何将这个数转换到属于[-3,12.1]的一个数?

其实我们可以利用占比。

假设抽出的二进制数转换成十进制是5417,0-26143这个区间可以划分为26143份,5417在这个区间的占比就是:

5417/262143 = 0.02066

也就是说转换到0-1区间里占比0.02066

转换到0-15.1区间里占比 15.1*0.02066 = 0.311966

但是现在的区间是从-3开始的,所以-3+0.311966= -2.688。

其实我们应该连着算比较精确:5417/262143 * 15.1 -3 = -2.687969

总结一下就是 先把二进制000001010100101001转换成十进制的5417,再将它除以2^n - 1, 再乘以区间长度15.1,在加上区间的开始值-3。

===================================================================================

后来,我在学进化规划的时候,发现又出现了一个做法,虽然我不知道这个做法是不是对算法有利的。就是想把种群的个体平均分布在区间内的操作。

比如说,种群里有100个个体,而区间是在[-3,12.1],区间长度是15.1,如果你想把种群的每个个体平均分布在区间内,

可以用15.1/100 = 0.151,也就是说每个个体大概可以占这么长,也就是说规定每个个体都只能在各自被规定的小区间内活动,

在小区间内自由活动,可以乘以一个概率,即0.151*rand(1),就随机生成了它的位置。

于是为了让第一个个体在第一个小区间内,第二个个体在第二个小区间内........

很容易得出某个个体应该处于哪个位置,比如第三个个体应该是在第三个小区间内随机生成的位置。同时要加上-3这个起始点。

所以假设当前是在计算第i个个体,那么它的位置就是:

-3 + (i-1)*(15.1/100) + (15.1/100)*rand(1),其中i从1到100迭代,rand(1)是生成0-1的随机数。

  • 14
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值