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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:27:05