遗传算法如何避免选择相同父代?现有代码重复选父代的原因是什么
问题诊断
你代码存在两个核心问题:
select_individual函数实现错误:你将return语句写在了for循环内部,循环仅执行1次就会返回结果,完全没有完成k=4次的竞标赛比较逻辑,实际效果仅为随机抽取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
相关产品推荐
相关产品推荐

