遗传算法中⼆进制编码的⽣成和解码-Python
以六峰值驼背函数为例,有两个变量,范围分别是[-3, 3], [-2, 2],精度要求为0.01
那么要使⽤⼆进制编码来表⽰的话,编码⽅法采⽤多参数级联编码⽅法,也就是把两个变量分别编码然后顺序拼接起来。根据遗传算法的编码⽅法,染⾊体的长度的计算公式应该是
代⼊[-3,3], [-2,2]和0.01,算得染⾊体长度分别为10和9,拼接起来就是19。
def encode(VAR_NUM, LB, UB, EPS):
L = np.zeros(3)
L[0] = 0
for i in range(VAR_NUM):
L[i + 1] = np.ceil(np.log2((UB[i] - LB[i]) / EPS + 1))
# 计算染⾊体的长度
LS = int(np.sum(L))
# 初始化种 01随机矩阵
pop = np.random.randint(0, 2, LS)二进制编码转换
# 要返回染⾊体切割点索引
return pop, np.cumsum(list(map(int, L)))
if__name__ == '__main__':
# 以六峰值驼背函数为例
# 六峰值驼背函数有两个⾃变量,
# 元素x[0]的范围是[-3,3]
# 元素x[1]的范围是[-2, 2]
print("随机⽣成⼀个⼆进制编码:")
bin_code, point = encode(2, [-3, -2], [3, 2], 0.01)
print(bin_code)
print("染⾊体切割点索引")
print(point)
输出:
随机⽣成⼀个⼆进制编码:
[1 0 0 0 0 0 1 0 1 1 0 0 1 1 0 0 0 0 1]
染⾊体切割点索引
[ 0 10 19]
解码的话,先把⼆进制转换为⼗进制,然后根据最⼤最⼩值标准化公式把数值限制到[-3,3]和[-2,2]即可。
# ⼆进制转化为⼗进制
def decode(bin_list, lb, ub):
length = len(bin_list)
temp = np.zeros(length)
for j in range(1, length): # 注意索引
temp[j] = np.power(2, length-1-j) * bin_list[j]
temp = np.sum(temp) # 0表⽰纵向求和,结果长度和列数相同
print("⼗进制数: ", temp)
real = lb + temp * (ub - lb) / (np.power(2, length) - 1)
return real
if__name__ == '__main__':
# 以六峰值驼背函数为例
# 六峰值驼背函数有两个⾃变量,
# 元素x[0]的范围是[-3,3]
# 元素x[1]的范围是[-2, 2]
print("随机⽣成⼀个⼆进制编码:")
bin_code, point = encode(2, [-3, -2], [3, 2], 0.01)
print(bin_code)
print("染⾊体切割点索引")
print(point)
print("解码为两个变量")
print("⼆进制数", bin_code[point[0]: point[1]])
print("标准化到[-3, 3]范围内", decode(bin_code[point[0]: point[1]], -3, 3))
print("⼆进制数", bin_code[point[1]: point[2]])
print("标准化到[-2, 2]范围内", decode(bin_code[point[1]: point[2]], -2, 2))
输出结果:
随机⽣成⼀个⼆进制编码:
[1 0 0 0 0 0 1 0 1 1 0 0 1 1 0 0 0 0 1]
染⾊体切割点索引
[ 0 10 19]
解码为两个变量
⼆进制数 [1 0 0 0 0 0 1 0 1 1]
⼗进制数: 11.0
标准化到[-3, 3]范围内 -2.935483870967742⼆进制数 [0 0 1 1 0 0 0 0 1]
⼗进制数: 97.0
标准化到[-2, 2]范围内 -1.2407045009784736
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论