Python遗传算法实践:修改Rat类实现大鼠性别分化繁殖模拟
大鼠繁殖选育模拟代码修改实现
以下是符合需求的完整可运行代码,同时修复了原代码中negative_mutation函数的缩进语法错误:
import random import string min_offspring = 5 max_offspring = 10 weight_min = 5 weight_max = 10 mutation_chance_rate = 10 # % mutation_weight_decrease = 20 # % generations = 20 multiplier = 1.1 # 新增性别数量常量,方便后续调整 PER_GENDER_NUM = 10 alphabet = string.ascii_lowercase + string.digits def random_name(): # 生成随机字符作为大鼠名称 return ''.join(random.choices(alphabet, k=5)) def print_population(population): for i, r in enumerate(population): print(f'no. {i+1:02d}, name: {r.name}, gender: {r.gender}, weight: {r.weight:.2f}') class Rat: def __init__(self, name, weight, gender): self.name = name self.weight = weight self.gender = gender # 性别取值为 male / female def breeding(male_parent, female_parent): """ 从公本、母本生成子代,子代随机分配性别 """ offspring = [] w1 = male_parent.weight w2 = female_parent.weight meanw = ((w1+w2)/2) * multiplier number_offspring = random.randint(min_offspring, max_offspring) for _ in range(number_offspring): name = random_name() weight = meanw # 子代50%概率为公,50%概率为母 gender = 'male' if random.random() < 0.5 else 'female' offspring.append(Rat(name, weight, gender)) return offspring def cut_offspring_by_gender(male_offspring, female_offspring): # 分性别按体重降序排序,各保留体重最高的指定数量个体 sorted_male = sorted(male_offspring, key=lambda x: x.weight, reverse=True) sorted_female = sorted(female_offspring, key=lambda x: x.weight, reverse=True) return sorted_male[:PER_GENDER_NUM], sorted_female[:PER_GENDER_NUM] def negative_mutation(population): # 10%概率发生负面突变,体重降低20% new_population = [] for p in population: current_name = p.name current_weight = p.weight current_gender = p.gender if random.randint(1, 100) <= mutation_chance_rate: current_weight = current_weight * (100 - mutation_weight_decrease) / 100 new_population.append(Rat(current_name, current_weight, current_gender)) return new_population def original_rats(): male_rats = [] female_rats = [] # 生成指定数量的初始公鼠 for _ in range(PER_GENDER_NUM): weight = random.uniform(weight_min, weight_max) male_rats.append(Rat(random_name(), weight, 'male')) # 生成指定数量的初始母鼠 for _ in range(PER_GENDER_NUM): weight = random.uniform(weight_min, weight_max) female_rats.append(Rat(random_name(), weight, 'female')) return male_rats, female_rats def main(): # 生成初始种群:公母各10只,总规模20只 male_rats, female_rats = original_rats() for i in range(1, generations + 1): # 繁殖阶段:打乱公母种群,一一配对繁殖 random.shuffle(male_rats) random.shuffle(female_rats) new_offsprings = [] for male, female in zip(male_rats, female_rats): new_offsprings.extend(breeding(male, female)) # 突变阶段 mutated_pop = negative_mutation(new_offsprings) # 按性别拆分子代种群 male_offspring = [r for r in mutated_pop if r.gender == 'male'] female_offspring = [r for r in mutated_pop if r.gender == 'female'] # 种群裁剪阶段:公母分别筛选最重的10只进入下一代 next_male, next_female = cut_offspring_by_gender(male_offspring, female_offspring) # 打印世代统计信息 print(f'=== 第 {i} 代 ===') all_rats = next_male + next_female avg_total = sum(r.weight for r in all_rats) / len(all_rats) avg_male = sum(r.weight for r in next_male) / PER_GENDER_NUM avg_female = sum(r.weight for r in next_female) / PER_GENDER_NUM print(f'总平均体重: {avg_total:.2f} | 公鼠平均: {avg_male:.2f} | 母鼠平均: {avg_female:.2f}\n') # 更新下一代亲本种群 male_rats, female_rats = next_male, next_female if __name__ == "__main__": main()
修改点说明
- 调整
Rat类新增gender属性,无需拆分为两个独立类即可区分雌雄个体 - 初始种群生成逻辑改为固定生成10只公鼠、10只母鼠,总规模保持20只不变
- 繁殖阶段改为先打乱公、母种群后一一配对,每个子代随机分配性别,符合真实繁殖逻辑
- 裁剪阶段改为分性别按体重降序排序,各保留体重最高的10只,每代性别比例固定为1:1
内容的提问来源于stack exchange,提问作者python noobie
相关产品推荐
相关产品推荐

