Netlogo:设置邻居值的语法问题

时间:2017-12-05 11:15:11

标签: netlogo

我正在使用Netlogo,我想建立一个场景,让我的乌龟不能移动到之前的补丁,也不能移动到前一个补丁(即补丁在t-1和在t-2)。

我已经设置了如下所示的内容。我们的想法是设置当前乌龟已经访问过的邻居的patch_attractive为零,因此无法选择它们。我想我只是在努力克服正确的语法。有问题的行是以“set prior_visited_pa​​tches”

开头的行
patches-own [patch_attractiveness]

turtles-own [previous2_patches]

to setup 
  create-turtles 100  [
    set previous2_patches (list patch-here)
  ]
end

to go
  tick

  ask turtles [
    let previous_patchset patch-set previous2_patches
    let previously_visited_neighbors neighbors with [member? self previous_patchset]
    ask previously_visited_neighbours [
      set patch_attractiveness 0
    ]
    face max-one-of neighbors [patch_attractiveness]
    fd 1
  ]

  set previous2_patches lput patch-here previous2_patches
  if (ticks > 1) [
    set previous2_patches remove-item 0 previous2_patches 
  ]

end

现在的代码似乎选择了t-2补丁,但也没有选择t-1补丁。有人有什么好主意吗?我假设“自我”可能不是正确的召唤

非常感谢

1 个答案:

答案 0 :(得分:1)

好的,我认为这可以做你想要的。

patches-own [patch-attractiveness]

turtles-own [previous2-patches]

to setup
  clear-all 
  create-turtles 100
  [ setxy random-xcor random-ycor
    set previous2-patches (list patch-here patch-here)
  ]
  ask patches [ set patch-attractiveness random 50 ]
  reset-ticks
end

to go
  ask turtles
  [ let candidates viable-neighbours neighbors previous2-patches
    if any? candidates
    [ face max-one-of candidates [patch-attractiveness]
      forward 1
      set previous2-patches (list patch-here item 0 previous2-patches)
    ]
  ]
end

to-report viable-neighbours [ set-of-patches delete-list ]
  let viable set-of-patches
  foreach delete-list
  [ x -> if member? x viable [ ask x [ set viable other viable ] ] ]
  report viable
end

首先,我将变量名称更改为连字符而不是下划线。对不起,连字符在NetLogo中很常见,在我出错之前我没有意识到你使用了下划线。

我做了一些简化。由于评论,我废弃了关于将吸引力设置为0的东西。我还简化了设置,以便排除补丁的起始列表只是当前补丁的两个副本(这意味着您不需要if ticks > 1测试)。我还从当前补丁和现有列表中的相关项创建了新列表 - 您的输入和删除更正确但由于列表只有两个项目,因此更容易阅读。如果您想增加要排除的补丁的内存,则应该保留lput / remove结构。

重要的一点是新程序。你传递了一个agentset(在你的情况下是neighbors)和一个要排除的代理列表(在你的情况下是turtle变量previous2-patches),它返回一个没有exclusions的agentset。它通过运行列表来完成并且,如果它在代理集中,则使用other原语删除它。