我正在创建一个模拟,以模仿入店行窃的行为。乌龟分为“专业”和“新手”入店行窃者,如果“专业”被商店安全保护所逮捕,他们可能(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:我已解决了错误。
答案 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
变量中。