设置新的目标补丁,但不包括Netlogo中的最新补丁

时间:2018-08-23 16:46:24

标签: netlogo target

我正在创建一个模拟,以模仿入店行窃的行为。乌龟分为“专业”和“新手”入店行窃者,如果“专业”被商店安全保护所逮捕,他们可能(1/2)想要选择一个新商店来定位“需要的新商店”。

“专业”入店行窃者以一定半径内“安全”值最低的商店为目标,所有值在创建时即被设置。

我正在尝试设置一个新的“目标商店”,即“安全性”第二低的“商店”半径10,即不包括当前的“目标商店”,但是我遇到了困难。

到目前为止,我已经尝试对以下代码进行一些补充,以排除当前的目标商店,这包括“会员?我的补丁”的变体,因为在此“补丁”中已添加了扒手的“商店” -set”,这将通知以后的命令。我还列出了一个升序的“安全性”值,以告知“入店行窃者”以“安全性”(确定商店脆弱性的值)作为“商店”的目标,与列表中的项目1相同,但我担心这样做可能会之所以无法使用,是因为其最初的目标商店不一定是商品0,因为它们以10个单位半径内的“安全性”最低的商店为目标。

这些是我目前正在使用的代码行,任何建议将不胜感激。

***编辑:理想情况下,我希望代码可以使用“ mypatches”,因此每次在商店逮捕一名专业入店行窃者时,可以将商店添加到mypatches中,随后的目标商店可以排除所有是mypatches的成员。

to new-target-store
ask turtles [ if
new-store-required = 1 and professional = 1 and    (random-float 1 < 0.5) [  
set target-store min-one-of store in-radius 10 [security]
]
]

end

编辑2:我已解决了错误。

1 个答案:

答案 0 :(得分:1)

您可能希望包括您的setup代码,或者如果它很长,则包含一个简化版本,以确保答案符合您所使用的结构。我可以通过使用一个turtles-own变量来存储当前目标来解决这个问题,如果目标为空,他们可以尝试填充该目标(而不是为此目的使用额外的布尔值)。另外,您可能希望将1/0选项转换为true / false以获得更清晰的代码。查看此示例设置:

globals [ stores ]

patches-own [ security ]

turtles-own [ 
  current-target 
  professional?
  mypatches 
]

to setup
  ca
  ask n-of 20 patches [
    set pcolor green
    set security 1 + random 10
  ]
  set stores patches with [ pcolor = green ]

  crt 5 [
    setxy random-xcor random-ycor
    pd
    set professional? one-of [ true false ]
    set current-target nobody
    set mypatches ( patch-set )
  ]
  reset-ticks
end

这将建立一个包含一些绿色补丁的世界,这些补丁被分组为patch-set的{​​{1}}。另外,您有一些乌龟将布尔值stores设置为true或false。它们初始化时没有存储professional?,没有一个空的current-target mypatches变量。

现在,您可以让乌龟检查其patch-set是否存在。如果不是,他们可以为商店中的变量(不等于问乌龟的current-target)中的变量(此处为possible-targets)分配一个商店。专业小偷可以通过排除属于其patch-here possible-targets变量的任何商店来进一步优化mypatches以排除他们被逮捕的任何商店。评论中的更多详细信息:

patch-set

如果您运行了足够长的时间,您的专业小偷最终将无法再找到目标商店,因为他们已将所有商店添加到其to go ask turtles [ ; if you have no target currently if current-target = nobody [ ; Create a temporary patch set made up of all stores except for ; the one that I'm currently in let possible-targets stores with [ self != [patch-here] of myself ] ifelse professional? [ ; Have professional thieves revise their possible targets to exclude ; any in the patchset mypatches, then choose a possible target set possible-targets possible-targets with [ not member? self [mypatches] of myself ] set current-target min-one-of possible-targets in-radius 10 [ security ] ] [ ; Have amateur thieves choose randomly from the possible targets set current-target one-of possible-targets ] ] ; move closer to your current target, or ; move to it exactly if you're near enough ifelse current-target != nobody [ face current-target ifelse distance current-target > 1 [ fd 1 ] [ move-to current-target ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; *** do your shoplifting attempt/check here *** ; For this example, just have professional thieves sometimes ; add this patch to their mypatches patchset ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; if professional? and random-float 1 < 0.5 [ set mypatches ( patch-set mypatches patch-here ) ] ; Reset current-target to nobody set current-target nobody ] ] [ ; if no suitable nearby targets, wander randomly rt random 61 - 30 fd 1 ] ] tick end 变量中。