我目前正在为囚徒困境游戏创建一个代码。在我的采用中,海龟代表伐木公司,补丁是树木,两家公司正在争夺树木,但可以通过重新种植来合作。
我遇到的问题是,下面的代码因为问龟而不断创建运行时错误,它声明:
只有观察者可以询问所有海龟的集合。 当乌龟0运行ASK时出错 由程序DEFOREST调用
按钮'调用&#39>。但是,如果我摆脱了ask turtles段,那么它会产生一个编译时错误,说明我不能在龟/补丁上下文中使用技巧,因为tick只是一个观察者。那么我该怎么做才能解决这个问题呢?在构建我的代码时,我可以暂时将其从go函数中删除,但在某些时候,我需要在go函数中调用代码。
;;动作功能 砍伐森林
问问龟[问] 问补丁0 0 [如果pcolor =绿色[设置pcolor棕色设置钱币+ 50套砍伐森林真实] ] ]答案 0 :(得分:0)
每个程序都有一个" context":哪个代理可以运行该程序。命令在NetLogo字典中标有其上下文。 (查找小图标。)如果使用仅观察者命令,例如tick
,则所有命令必须是观察者命令。 (只有观察者才能运行该过程。)如果使用turtle-only命令,那么所有命令都必须是turtle命令。 (只有一只乌龟可以运行该程序。)如果混合上下文,则表示错误。
现在,任何代理都可以运行ask
。但是,NetLogo构建一个约束:只有观察者可以ask turtles
。这是因为,例如,有一只乌龟要求所有海龟(包括其自身)做某事,这几乎总是一个错误。但是你可以有一只海龟ask other turtles
。这是允许但危险的,以下列方式。如果你有100只海龟,每只要求其他99只海龟做一些事情,你将运行ask
9900次。这大致是海龟数量的平方。所以这是允许的,但在你做之前你应该认真思考。
总之,如果您想要ask turtles
中的deforest
,则需要确保只有观察者正在运行deforest
,而不是turtles
。但最重要的是,你几乎肯定不希望每只乌龟都要求一个补丁(一遍又一遍)来检查砍伐森林。这看起来像程序逻辑中的错误。