NetLogo中按概率补充动物至能量上限的实现方法
完善NetLogo动物补充代码实现按概率生成对应能量海龟
以下是修正后的完整代码,同时附关键修改说明:
extensions [ rnd ] ; 定义全局变量存储总能量(也可在过程中实时计算) globals [ total_energy ] to setup ; 初始化模型基础配置 clear-all set total_energy 0 ; 其他初始化逻辑(如创建初始海龟、设置景观等) end to replenish ; 先计算当前系统中圆形海龟的总能量 set total_energy sum [energy] of turtles with [shape = "circle"] ; 循环补充动物,直到总能量接近或达到上限(允许偶尔因高能量个体超出) while [ total_energy < 10950 ] [ ; 你的能量类别列表 let energy_values [75 216 700 2500 5000 8500 25000] ; 对应概率(原百分比已转换为小数) let energy_probs [0.2085714667 0.0724206481 0.0223469429 0.006257144 0.003128572 0.0018403365 0.0006257144] ; 将能量值与概率配对 let energy_pairs (map list energy_values energy_probs) ; 按权重随机选中一个能量值 let selected_energy first rnd:weighted-one-of energy_pairs [ last ? ] ; 创建对应能量的动物海龟 create-turtles 1 [ set shape "circle" set energy selected_energy ; 可添加初始位置设置 setxy random-xcor random-ycor ] ; 更新总能量 set total_energy total_energy + selected_energy ] end
关键修改说明
- 修正循环判断条件:原代码直接使用
energy < 10950错误,energy是海龟个体变量,需用全局总能量total_energy判断系统整体能量状态。 - 替换真实数据:将示例的占位值替换为你提供的能量类别与概率,注意将原百分比概率转换为小数(除以100)。
- 正确生成海龟:选中能量值后,通过
create-turtles 1创建海龟,同步设置shape和energy变量。 - 处理超出上限场景:循环会在总能量达到或超过10950时终止。若选中高能量个体导致超出,本次创建依然执行,符合你“允许偶尔超出”的需求。
可选优化:精准控制超出频率
如果希望尽量避免频繁超出上限,可在创建前增加判断逻辑,仅允许小概率触发超出:
while [ total_energy < 10950 ] [ let energy_values [75 216 700 2500 5000 8500 25000] let energy_probs [0.2085714667 0.0724206481 0.0223469429 0.006257144 0.003128572 0.0018403365 0.0006257144] let energy_pairs (map list energy_values energy_probs) let selected_energy first rnd:weighted-one-of energy_pairs [ last ? ] ; 仅当添加后不超上限,或10%概率强制允许超出时,才创建海龟 if (total_energy + selected_energy <= 10950) or (random-float 1 < 0.1) [ create-turtles 1 [ set shape "circle" set energy selected_energy setxy random-xcor random-ycor ] set total_energy total_energy + selected_energy ] ]
内容的提问来源于stack exchange,提问作者adkane
相关产品推荐
相关产品推荐

