遗传算法二进制初始种群构建问题:输出格式不符XY配对需求
遗传算法初始种群二进制编码格式修正问题
问题描述
需要为求解方程 z = x⁵ - 10x³ + 30x - y² + 21y 的遗传算法创建二进制初始种群,编码规则如下:
- X和Y的取值范围为
[-2.5, 2.5] - 第1位表示符号(0或1)
- 第2-3位表示整数部分(取值0-2,对应编码00、01、10)
- 剩余位表示小数部分(取值0-5000)
原Python代码如下:
def pop(pop_size): pop = [] for i in range(pop_size): for j in range(2): signal = bin(np.random.randint(0, 2))[2:] integer = bin(np.random.randint(0, 3))[2:] float = bin(np.random.randint(0, 5001))[2:].zfill(13) binary = [signal, integer, float] binary = [''.join(binary)] pop.append(binary) return pop
当前输出格式为:
[['1110001000110000'], ['1100010010011000'], ['11000100010001010'], ['0100011000000010'], ['0100010111100001'], ['01000111001101110']]
期望输出格式(每个子列表对应一个种群个体,包含X和Y的二进制编码):
[['1110001000110000', '1100010010011000'], ['11000100010001010', '0100011000000010'], ['0100010111100001', '01000111001101110']]
问题原因
原代码的内层循环每生成一个X/Y的编码就直接将单个编码的列表追加到总种群列表中,导致每个元素仅包含一个变量的编码。而我们需要每个种群个体对应一对X和Y编码,因此需要在外层循环中先收集当前个体的两个编码,再将这对编码作为子列表加入总种群。
修正后的代码
import numpy as np def create_population(pop_size): pop = [] for _ in range(pop_size): individual = [] # 生成X和Y的编码各一个 for _ in range(2): # 符号位:确保是1位 signal = bin(np.random.randint(0, 2))[2:].zfill(1) # 整数部分:0-2,补全为2位编码 integer = bin(np.random.randint(0, 3))[2:].zfill(2) # 小数部分:0-5000,补全为13位编码 float_part = bin(np.random.randint(0, 5001))[2:].zfill(13) # 拼接成完整编码 binary_code = ''.join([signal, integer, float_part]) individual.append(binary_code) # 将包含X和Y编码的个体加入种群 pop.append(individual) return pop
补充说明
- 修复了原代码中
integer的补位问题:原代码中随机到0时整数部分是'0',未补全为规则要求的2位编码,修正后统一为2位格式,保证编码长度一致。 - 重命名了函数和变量,避免与Python内置名称
pop、float冲突,提升代码可读性。 - 外层循环每次生成一个包含X和Y编码的子列表,再加入总种群,完全匹配期望的输出格式。
内容的提问来源于stack exchange,提问作者Gabriel Schumacher
相关产品推荐
相关产品推荐

