为何我的Go Procedure中citizen-movement触发runtime error?
问题分析与解决
错误原因
这个错误的核心是:当编号33的市民海龟走到NetLogo世界的边缘时,patch-ahead 1会返回NOBODY(无对应补丁),此时执行[pcolor] of NOBODY就会触发类型不匹配错误。
员工移动过程没报错只是巧合——要么员工还没走到世界边缘,要么员工的移动逻辑刚好避开了边缘场景,但实际上employee-movement代码同样存在这个潜在问题。
修复方案
方案1:先检查补丁有效性再判断颜色
修改citizen-movement(建议同步修改employee-movement避免后续报错),先确认前方存在有效补丁,再进行颜色判断:
to citizen-movement ask citizens [ ifelse any? patch-ahead 1 and [pcolor] of patch-ahead 1 = grey [ rt random-float 360] [ forward 1 ] ] end to employee-movement ask employees [ ifelse any? patch-ahead 1 and [pcolor] of patch-ahead 1 = black [ rt random-float 360] [ forward 1 ] ] end
any? patch-ahead 1会先判断前方是否存在有效补丁,避免对NOBODY执行of操作。
方案2:开启世界边缘环绕
如果模型逻辑允许海龟从世界一侧穿到另一侧,可以在NetLogo的Settings面板中勾选“Wrap world edges”选项。这样海龟走到边缘时会自动从对侧出现,patch-ahead 1永远不会返回NOBODY,从根源解决问题。
内容的提问来源于stack exchange,提问作者premiumcopypaper
相关产品推荐
相关产品推荐

