仅改动态生育率
时间: 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.011 | 0.011 × 0.71 × ~1.0 ≈ 0.0078 |
| 狼=100时 | 0.011 | 0.011 × 0.33 × ~0.8 ≈ 0.0029 |
| 狼=300时 | 0.011 | 0.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) # 更敏感
改完跑一下,把数据发我,我帮你分析效果!
