如何用循环实现Python遗传算法中的父代交叉操作?
遗传算法交叉函数的循环实现优化
需求分析
你当前手动实现了前3组父代的交叉逻辑,现在需要用循环替代重复的手动代码,既可以适配任意数量的父代,也能严格复现原函数的输出结果。
方案1:适配任意父代数量的通用循环实现
这个版本会自动遍历所有两两不同的父代对,生成双向交叉的子代(每对父代生成两个子代),扩展性更强:
import numpy as np def cruce(padres): mitad_herencia = len(padres[0]) // 2 hijos = [] # 遍历所有i<j的父代对,避免重复处理同一对的反向组合 for i in range(len(padres)): for j in range(i + 1, len(padres)): # 生成i前半+ j后半的子代 hijo_ij = np.concatenate((padres[i][:mitad_herencia], padres[j][mitad_herencia:])) # 生成j前半+ i后半的子代 hijo_ji = np.concatenate((padres[j][:mitad_herencia], padres[i][mitad_herencia:])) hijos.extend([hijo_ij, hijo_ji]) # 以元组形式返回所有子代,和原函数返回格式一致 return tuple(hijos)
方案2:严格复现原函数的循环实现
如果需要完全匹配你手动写的5个子代逻辑(仅处理前3个父代,生成(0,1)双向、(0,2)双向、(1,2)单向的子代),可以用预定义交叉对的方式:
import numpy as np def cruce(padres): mitad_herencia = len(padres[0]) // 2 hijos = [] # 定义和原手动逻辑完全一致的交叉索引对 pares_cruce = [(0, 1), (1, 0), (0, 2), (2, 0), (1, 2)] for padre_idx1, padre_idx2 in pares_cruce: hijo = np.concatenate((padres[padre_idx1][:mitad_herencia], padres[padre_idx2][mitad_herencia:])) hijos.append(hijo) return tuple(hijos)
测试验证
用你提供的父代数组测试,输出结果和原手动函数完全一致:
padres = np.array([ [1,0,0,0,1,0],[0,1,1,1,1,0],[1,0,1,0,1,1], [0,1,1,0,1,0],[0,0,0,0,1,0],[1,0,0,0,0,0], [1,1,1,0,1,0],[0,0,1,1,0,0],[0,1,1,0,1,0], [1,0,1,0,1,0] ], np.int32) # 调用函数并打印结果 resultado = cruce(padres) for num, hijo in enumerate(resultado[:5], 1): print(f"hijo{num}: {hijo}")
内容的提问来源于stack exchange,提问作者slow_learner
相关产品推荐
相关产品推荐

