编码:将不同的实数表示成不同的0,1二进制串表示就完成了编码。这个是比较简单的。
解码:将编码后的二进制串转换为我们理解的十进制串,所以我们需要的是y = f (x)的逆映射,也就是将二进制转化为十进制并映射到某个区间,也就是解码。
例如:十进制与二进制相互映射的关系表示如下:
对于一个长度为10的二进制串,如[0,0,0,1,0,0,0,0,0,1],将其映射到[1,3]这个区间的步骤为:
- 首先将二进制数按权展开:
- 然后将其压缩到区间[0,1]:
- 最后将[0,1]区间的数映射到我们想要的区间[1,3]:,可以看出规律为:num * (high-low)+low 其中num为[0,1]之间的数对应此处的0.0635386,high和low表示我们想要映射的区间的上边界和下边界,分别对应此处的3和1。
分析:
上述步骤包含了编码与解码的过程:首先我们将65编码为一个具有10位长度的二进制数,然后将其压缩到区间[0, 1],最后将[0, 1]区间的数映射到[1, 3]这个范围,即编码之后求一个逆映射将这个二进制串映射到[-3,3]区间,这个过程也就是解码。
关于编码:这里有个问题,即编码为了10位长度的二进制数,如果用更长的二进制数编码,又有什么变化呢?
10位二进制可以表示种不同的状态,可以看成是在最后要转化为的十进制区间 [ 1 , 3 ] 切分个点,每个点对应的数据对应着一个二进制编码。可看出,如果我们增加二进制串的长度,那么我们对区间的切分可以更加精细,每个二进制编码对应的切分的点位置也就更加精确,意即对应的十进制数也更加精确。
例如:
10位的二进制编码1111111111(全1),将其按权展开为1023,最后映射到[-3, 3]区间时为3,而1111111110(前面9个1)按权展开为1022,,。如果编码为12位二进制,111111111111(12个1)最后转化为3,而111111111110(前面11个1)按权展开为4094,,。
3−2.994134=0.005866;3 − 2.998534 = 0.001466
所以用10位二进制编码划分区间后,每个二进制状态改变对应的实数大约改变0.005866,而用12位二进制编码这个数字下降到0.001466,所以DNA长度越长,解码为10进制的实数越精确。