动画 文章

日/韩留学,小语种(日/韩/俄)高考,小语种培训,应用下载

仅改动态生育率

时间: 2026-08-07 11:45:33

好的,仅改动态生育率,告诉你具体改哪里、怎么改。




🔧 改动位置:agents.py 中的 Wolf.step() 方法


找到这段代码(约在第 250-265 行):


# ===== 繁殖(提高繁殖率) =====
if self.energy > 30 and self.age > 6:
fitness = self.energy / 40 + self.hunt_success / 15 + self.genes['strength'] * 0.5
prob = self.reproduce_prob * min(2.0, fitness)

if random.random() < prob: self._reproduce()


替换为:


# ===== 繁殖(动态密度制约) =====
if self.energy > 30 and self.age > 6:
# 1. 获取当前种群数量
total_wolves = len([a for a in self.model.agents if isinstance(a, Wolf) and a.alive])
total_sheep = len([a for a in self.model.agents if isinstance(a, Sheep) and a.alive])

# 2. 密度制约因子:狼越多,繁殖率越低
#    狼=20时,因子=1/(1+0.4)=0.71
#    狼=100时,因子=1/(1+2)=0.33
#    狼=300时,因子=1/(1+6)=0.14
density_factor = 1.0 / (1.0 + total_wolves / 50.0)

# 3. 食物因子:羊足够多时,繁殖率可略高
#    防止羊极多时狼也不繁殖
food_factor = min(2.0, total_sheep / (total_wolves * 8 + 1))

# 4. 计算最终动态繁殖率
dynamic_rate = self.reproduce_prob * density_factor * food_factor
dynamic_rate = max(0.001, min(self.reproduce_prob * 2, dynamic_rate))

# 5. 个体适应度(不变)
fitness = self.energy / 40 + self.hunt_success / 15 + self.genes['strength'] * 0.5

# 6. 最终繁殖概率
prob = dynamic_rate * min(2.0, fitness)

if random.random() < prob:
self._reproduce()




📋 完整替换后的 Wolf.step() 方法(仅显示修改部分)


def step(self):
if not self.alive or self.cell is None:
return

self.age += 1
# 能量消耗 energy_cost = 0.8 + self.genes['speed'] * 0.1 self.energy -= energy_cost
# ===== 饥饿反馈:饿的时候更激进 ===== if self.starving_counter > 3: self.energy -= 0.5
if self.energy <= 0 or self.age > 60: self.alive = False self.remove() self.cell = None return
# ===== 捕猎 ===== self._hunt()
# ===== 繁殖(动态密度制约) ===== if self.energy > 30 and self.age > 6: # 获取当前种群数量 total_wolves = len([a for a in self.model.agents if isinstance(a, Wolf) and a.alive]) total_sheep = len([a for a in self.model.agents if isinstance(a, Sheep) and a.alive]) # 密度制约因子 density_factor = 1.0 / (1.0 + total_wolves / 50.0) food_factor = min(2.0, total_sheep / (total_wolves * 8 + 1)) dynamic_rate = self.reproduce_prob * density_factor * food_factor dynamic_rate = max(0.001, min(self.reproduce_prob * 2, dynamic_rate)) fitness = self.energy / 40 + self.hunt_success / 15 + self.genes['strength'] * 0.5 prob = dynamic_rate * min(2.0, fitness) if random.random() < prob: self._reproduce()




📊 改动前后对比


项目修改前修改后
繁殖率固定值 0.011动态:狼多时下降,羊多时略升
狼=20时0.0110.011 × 0.71 × ~1.0 ≈ 0.0078
狼=100时0.0110.011 × 0.33 × ~0.8 ≈ 0.0029
狼=300时0.0110.011 × 0.14 × ~0.4 ≈ 0.0006


效果:狼越多,繁殖率越低,防止狼过度增长;狼少时,繁殖率恢复正常。




🧪 验证方法


1. 修改 agents.py

2. 运行 run_and_export.py(使用稳定参数)

3. 对比修改前后的数据:


# run_and_export.py
model = WolfPackDynamics(
initial_sheep=350,
initial_wolves=20,
sheep_reproduce=0.12,
wolf_reproduce=0.011,
wolf_energy_from_food=20,
grass_regrowth_time=4
)

for _ in range(1000): model.step()
df = model.export_data("wolf_pack_data_dynamic.csv") print(df.tail())


4. 观察狼的峰值是否从 316 降到更低,羊的谷值是否从 7 升到更高。




💡 如果还想更平稳


可以调整 density_factor 的分母(当前是50):


分母效果
30更敏感,狼到90时繁殖率已很低 → 狼峰值更低
50中等(推荐)
80更不敏感 → 狼峰值更高


如果想进一步压低狼峰值,把 50 改成 30:


density_factor = 1.0 / (1.0 + total_wolves / 30.0)  # 更敏感


改完跑一下,把数据发我,我帮你分析效果!


上一个 项目 环境安装与路径说明 高中物理知识列表 下一个 生态稳定性维持机制 单因子 多因子

物理热词


问答

Latest

工具

© 2019-现在 简易物理,让物理教学更简单

沪ICP备17002269号