NetLogo:选择修补程序集的相邻修补程序

NetLogo:选择修补程序集的相邻修补程序,netlogo,Netlogo,我正在NetLogo中为主范围选择建模。我想让一只海龟来识别与其当前居住地相邻的补丁的子集。然后,海龟应该确定哪个邻近的区域是最好的(目前定义为具有最高食物效益的区域),并移动到该区域进行索赔。它继续执行这些步骤(确定主范围附近的可用补丁,选择最佳选项,添加到主范围,重复),直到主范围内有足够的食物 代码的一部分如下所示,但我得到的错误是“面对预期的输入,成为一个代理,但却没有得到任何人。”我认为reporter或我对它的使用出了问题(我对reporter是新手;我正在尝试将代码模块化,以最小化

我正在NetLogo中为主范围选择建模。我想让一只海龟来识别与其当前居住地相邻的补丁的子集。然后,海龟应该确定哪个邻近的区域是最好的(目前定义为具有最高食物效益的区域),并移动到该区域进行索赔。它继续执行这些步骤(确定主范围附近的可用补丁,选择最佳选项,添加到主范围,重复),直到主范围内有足够的食物

代码的一部分如下所示,但我得到的错误是“面对预期的输入,成为一个代理,但却没有得到任何人。”我认为reporter或我对它的使用出了问题(我对reporter是新手;我正在尝试将代码模块化,以最小化过程长度)

知道我哪里出错了吗?谢谢

patches-own [
  owner
  benefit 
  used?
  ]

to-report edge-patches-of [my-homerange]  ;; reporter to find patches along edge of homerange
  report my-homerange with [
    any? neighbors with [
      owner = [owner] of myself
    ]
   with [used? = false]  ;; (only want neighboring patches not already owned)
  ]
end

to pick-homerange
         ifelse food < food-needed  ;; (turtle builds homerange until it has enough food)
          [ let my-homerange patches with [owner = myself]
            ask edge-patches-of my-homerange [set pcolor red ]  ;; (this to just see the options)

            ;; now that we know the options, pick the best: 
            let available-destinations edge-patches-of my-homerange   
            set destination max-one-of available-destinations [([benefit] of patches)]
             face destination
              forward 1
              if patch-here = destination
               [ add-destination ]  
           ]
         [stop] 
end
自己的补丁程序[
主人
利益
用过吗?
]
报告[my homerange]的边缘补丁;;记者沿着homerange的边缘寻找补丁
报告我的家庭范围[
有吗?有邻居吗[
所有者=[所有者]我自己
]
使用[used?=false];;(只需要尚未拥有的相邻修补程序)
]
结束
选择本垒打
如果其他食物<所需食物;;(乌龟在有足够的食物之前建造家园)
[让我的homerange与[所有者=我自己]进行修补]
询问my homerange的边缘修补程序[设置pcolor red];;(这只是为了查看选项)
;既然我们知道了选项,就选择最好的:
让可用的目标成为我的homerange的边缘修补程序
将目标最大值设置为一个可用目标[([补丁的好处])]
面向目的地
转发1
如果这里的补丁=目的地
[添加目的地]
]
[停止]
结束

您没有包含足够的代码或描述来确定,但您的逻辑似乎过于复杂,并且包含概念错误。尝试将此作为起点。请特别注意候选边面片的非空集的测试

globals [food-needed]
patches-own [owner capacity]
turtles-own [homerange]

to setup ;make sure all turtles have an initial homerange
  ca
  ask patches [set owner nobody]
  crt 10 [
    set-initial-ownership
    ;do the following just once, not over and over
    set homerange (patches with [owner = myself])
  ]
  ;etc
end

to-report benefit [_t] ;patch proc
  ;patch reports benefit to turtle _t
  report 1 ;or whatever
end

to-report food ;turtle proc
  report sum [capacity] of homerange
end

to pick-homerange ;turtle proc
  ;; (turtle builds homerange until it has enough food)
  if (food >= food-needed) [stop]
  let _candidates edge-patches
  if any? _candidates [  ;you almost certainly need to add this
    let _destination max-one-of _candidates [benefit myself]
    face _destination forward 1
    if (patch-here = _destination) [augment-homerange _destination]
  ]
end

to augment-homerange [_p] ;turtle proc
  ask _p [set owner myself]
  ;just add to the homerange as needed; don't keep recreating it
  set homerange (patch-set homerange _p)
end

to-report edge-patches ;turtle proc
  ;; (only want neighboring patches not already owned)
  report (patch-set [neighbors] of homerange) with [owner = nobody]
  ]
end

此错误意味着没有适合您的报告程序条件的修补程序。这并不一定意味着你的记者没有工作——一只海龟可能只是没有补丁,它可以从它现在的家里扩展到其他地方。您可以通过添加if语句开始故障排除,这样您的
face destination
块仅在报告的“destination”不是nobody时运行(类似于
if destination!=nobody[
face destination…等]
)。这将有助于确定您的记者是否按预期工作。谢谢您的帮助!我对NetLogo很陌生。你能解释一下你看到的概念错误吗?此外,我已经尝试按照您的建议修改代码,但仍然得到一个“0”的目标,所以什么也没有发生——海龟不会选择一个家庭范围。我完全糊涂了。我不明白为什么它不能从一个边缘补丁中设置目标。还有什么建议吗?这是一个不同于以前的错误。听起来您仍然将destination作为海龟属性,并且在为其分配补丁之前正在使用它。我发布的代码不是这样的,其中
\u destination
是一个局部变量。(您发布的代码没有生成一个持久的海龟目的地,所以我没有包含一个。)好的,是的,目的地是海龟属性,我看可能没有理由这样做。现在它是一个局部变量。我很兴奋,因为这现在大部分都有效了,但有一件事是新的。海龟偶尔会一次又一次地“挂”在两块地之间。也就是说,它不会到达目的地,但会在两个随机补丁之间反弹。你知道这是什么原因吗?有没有办法让海龟显示它当前的目的地,这样我就能知道这是否是问题的一部分?谢谢@用户847462此外,新问题应作为新问题而不是评论提出。然而,我猜目标补丁正在改变每一个动作,这可能会追溯到您是如何计算收益的。确保当海龟靠近时,补丁的好处不会减少。