《基于Agent与个体的建模》第5章蝴蝶Hilltopping习题corridor width结果不符问题
问题根源
- 核心错误是
corridor-width计算逻辑不符合习题定义:书中走廊宽度为「被踩踏过的patch总数」除以「所有蝴蝶从起点到山顶的平均移动总路程」,你当前用的是蝴蝶到起点的直线距离作为分母,数值远小于实际路程,导致结果大幅偏低。 - 缺少蝴蝶到达山顶后的停止逻辑:如果蝴蝶到达山顶后继续移动,会导致总路程统计虚高,进一步压低计算结果。
- 隐式上下文赋值有歧义:在turtle上下文直接修改patches-own的
used?变量,部分NetLogo版本可能出现赋值异常。
修复方案
- 给turtles新增
total-distance变量,记录每只蝴蝶移动的总步数 - 修改
corridor-width的分母为所有蝴蝶的total-distance平均值 - 新增山顶判定逻辑,蝴蝶到达山顶后停止移动
- 明确
used?变量的赋值对象为当前所在patch
修复后完整代码
patches-own [elevation used?] turtles-own [start-patch total-distance reached-peak?] to setup ca ask patches [ set elevation 200 + (100 * (sin (pxcor * 3.8) + sin (pycor * 3.8))) set pcolor scale-color green elevation 0 400 set used? false ] reset-ticks create-turtles 500 [ set size 2 setxy 71 69 pen-down set start-patch patch-here set total-distance 0 set reached-peak? false ] end to go ask turtles with [not reached-peak?] [move] plot corridor-width tick if ticks >= 1000 or all? turtles [reached-peak?] [ output-print word "Corridor width: " corridor-width stop ] end to-report corridor-width let countpatches count patches with [used?] let mean-traveled mean [total-distance] of turtles report countpatches / mean-traveled end to move ; 判定是否到达山顶 if elevation >= max [elevation] of neighbors [ set reached-peak? true stop ] ifelse random-float 1.0 < q [uphill elevation 1] [move-to one-of neighbors] set total-distance total-distance + 1 ask patch-here [set used? true] end
验证说明
修复后将全局变量q的滑块设为0.4,运行后得到的corridor width结果会落在320-330的预期区间内。
内容的提问来源于stack exchange,提问作者raurackl
相关产品推荐
相关产品推荐

