You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用循环实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 17:32:03