格雷码(Gray Code)是一种特殊的二进制编码方式,其中相邻的两个格雷码之间只有一个二进制位不同。这种编码方式不仅保证了相邻数字之间的差异最小,从而降低了错误率,这种编码方式的特点使得它在数据传输和旋转编码器等领域具有显著的优势。

最近,在重构遗传算法的过程中,想到使用格雷码表征基因序列。二进制编码与格雷码在操作系统层面,可能格雷码优势已经不太显现,操作系统层面已经做了码制转换或者编码纠错太多手段降低误码率,即使是格雷码也需要进行特定编码再由操作系统输出给硬件。

1 编码

编码过程分为两步。

第一步,实数转换成二进制编码,这个过程用比较而不是算术操作,降低了系统对计算的需求,简单比较电路即可实现,不同比较器属于模拟电路范畴,专用程度太高。

第二步,二进制编码进一步编码成格雷码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def real2gray(lb, ub, precision, x):
len_single_Chrom = int(np.ceil(np.log2((ub-lb)/precision+1)))
y = np.round((x-lb)/precision)
print("y", y)
bin=[]
for i in range(len_single_Chrom):
# print(i, y, bin)
if(y >= (2**(len_single_Chrom-i-1))):
binary_list = np.logspace(start=(len_single_Chrom-1-i),stop=0,base=2,num=(len_single_Chrom-i))
binary_array = np.cumsum(binary_list)
if binary_array[0] > y:
bin.append(0)
else:
bin.append(1)
y = y - (2**(len_single_Chrom-i-1))
continue
else:
bin.append(0)
compare_bit = 0
gray_list = []
for i in range((len(bin))):
if bin[i] == compare_bit:
gray_list.append(0)
else:
gray_list.append(1)
compare_bit = bin[i]
return np.array(gray_list).reshape((1, len_single_Chrom))

2 解码

解码系统是将格雷码转换成实数,该过程最终需要将输出离散值与实数值做一个空间对应转换。

1
2
3
4
5
6
7
8
9
10
11
def gray2real(GRAY):
_, len_gray= GRAY.shape
BINV = GRAY.cumsum(axis=1)%2
# GRAY_CODE = BINV.cumsum(axis=1)%2
print("1 BINV",BINV)
# print(GRAY, BINV, GRAY_CODE)
binary_list = np.logspace(start=0, stop=(len_gray-1), base=0.5, num=len_gray)
print("2 binary_list",binary_list)
real_list = (BINV*binary_list).sum(axis = 1)/binary_list.sum()
print("3 real_list", real_list)
return real_list

在实现编码解码的过程中,发现一个有趣的事情,格雷码编码系统,通过有限次编码可以实现解码。

3 通过有限次编码可以实现解码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import numpy as np
len = 200
max_item = 20000
gv = np.random.randint(0, 2, size = (len))

print("1_gv", gv)

bin_list = np.logspace(start=len-1, stop=0, base=2, num=len)
# print(bin_list)
bv = gv
for i in range(max_item):
bv = bv.cumsum()%2
if (bv == gv).all() :
print("输出迭代",i, gv ,bv)
break
print("2_bv", bv)

从学数字电路开始,数字 IC 设计中或者自行设计电路、写程序的过程中,就一直非常青睐格雷码。

但这次重构遗传算法,旨在从基因角度入手调优该算法,发现了格雷码具有有限次编码实现解码的特点,还是觉得非常有意思。

仿佛在说,世界是普遍联系的,兜兜转转又回到起点。

⚓ Carl Zhao
🏢 逍遥科技有限公司
💭 曾经也是追光少年,然而少年归来已不再是少年,但依然在追光的路上。
📧 邮箱:1005513510@qq.com