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

遗传算法如何避免选择相同父代?现有代码重复选父代的原因是什么

问题诊断

你代码存在两个核心问题:

  1. select_individual函数实现错误:你将return语句写在了for循环内部,循环仅执行1次就会返回结果,完全没有完成k=4次的竞标赛比较逻辑,实际效果仅为随机抽取2个个体返回适应度更高的那个,大幅拉高了高适应度个体被选中的概率。
  2. 父代选择环节没有去重逻辑:两次父代选择是完全独立的随机过程,竞标赛选择本身属于有放回抽样,本身就存在连续选中同一个个体的概率,你没有做重复校验自然会出现重复父代的情况。
重复父代的原因
  • 竞标赛选择属于有放回抽样,高适应度个体被选中的概率本身就高于其他个体,连续两次选中同一个体属于正常概率事件
  • 错误的选择函数实现进一步拉高了高适应度个体的选中概率,提升了重复出现的概率
  • 选择逻辑中没有加入重复校验机制,无法拦截连续选中同一个体的情况
修复方案

首先修复竞标赛选择函数,改为标准实现,返回个体索引方便后续去重:

import numpy as np
# 标准竞标赛选择,返回选中个体的索引
def select_individual(population, scores, k=4):
    # 随机抽取k个候选索引
    candidates = np.random.randint(0, len(population), k)
    # 返回k个候选中适应度最高的个体索引
    winner_idx = candidates[np.argmax(scores[candidates])]
    return winner_idx

然后调整父代选择逻辑,加入重复校验:

# 修正你初始种群的语法错误
population = np.array([[0,0,0,0,1],[0,0,0,1,0],[0,0,1,0,0],[0,1,0,0,0]])
scores = np.array([2,3,4,5])

for i in range(0, len(population), 2):
    # 选择第一个父代
    p1_idx = select_individual(population, scores)
    # 选择第二个父代,和第一个重复就重新选择
    p2_idx = select_individual(population, scores)
    while p2_idx == p1_idx:
        p2_idx = select_individual(population, scores)
    # 取出对应个体
    parent_1 = population[p1_idx]
    parent_2 = population[p2_idx]
    
    print('Parent_1: ', np.round(parent_1, 2))
    print('Parent_2: ', np.round(parent_2, 2))

如果你的种群规模较小,也可以选择无放回的选择逻辑,每选中一个个体就将其从候选池中移除,避免后续重复选中,这种方案更适合种群规模不大的场景。

内容的提问来源于stack exchange,提问作者Zzyy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:27:03