Recursion NetLogo中的递归
在NetLogo 6.1.1中,我有一个品种(游骑兵)在绿草地(灌木丛)寻找另一个品种(陷阱) 我无法理解的行为是:Recursion NetLogo中的递归,recursion,netlogo,Recursion,Netlogo,在NetLogo 6.1.1中,我有一个品种(游骑兵)在绿草地(灌木丛)寻找另一个品种(陷阱) 我无法理解的行为是: 如果发现陷阱,移除陷阱的成功率为80%;然后 重复相同的过程(热点搜索;递归调用) 如果未发现陷阱(20%概率),则重复相同的步骤 过程(热点搜索;注释掉的部分->导致无休止的循环)5次 如果这5次没有清除陷阱,则恢复正常行为(随机右转并向前移动1) 我该怎么做 ;; globals ========================= breed [rangers ranger]
;; globals =========================
breed [rangers ranger]
breed [snares snare]
rangers-own [snare-found?]
;; initialise ========================
to setup
resize-world -4 4 -4 4
clear-all
create-rangers 1 [set color blue]
ask patches [
if random 100 < 20 [set pcolor green]]
ask patches with [pcolor = green] [
sprout-snares random 5]
ask snares [
set size 0.5
set shape "dot"
fd 0.25
]
reset-ticks
end
;; main ==================================
to go
ask rangers [
rt random 181 - 90
fd 1
if any? snares-here [hotspot-search]
hotspot-search
]
end
;; functions ===============================
to hotspot-search
move-to patch-here
let target one-of snares-here
if (random 100 < 20) and (target != nobody) [
ask target [die]
set snare-found? true
hotspot-search
]
;;if snare-found? = true [
;; repeat 5 [hotspot-search]
;;]
end
;;全球的=========================
繁殖[游骑兵游骑兵]
繁殖[圈套]
流浪者自己的[发现陷阱?]
;; 初始化========================
设置
调整世界大小-4-4 4
清除所有
创建游骑兵1[设置蓝色]
询问补丁[
如果随机100<20[设置颜色为绿色]]
使用[pcolor=绿色]询问修补程序[
发芽陷阱随机5]
设圈套[
设置大小为0.5
设置形状“点”
fd 0.25
]
重置滴答声
结束
;; 主要==================================
外带
问流浪者[
rt-随机181-90
fd 1
如果有的话?这里有陷阱[热点搜索]
热点搜索
]
结束
;; 功能===============================
热点搜索
移动到这里的补丁
让我们瞄准其中一个陷阱
如果(随机100<20)和(目标!=无人)[
问目标[死]
找到陷阱了吗?对
热点搜索
]
;;如果发现陷阱?=真的[
;重复5[热点搜索]
;;]
结束
我的一个观察结果是,如果你想让流浪者搜索5次,成功率为20%,但搜索不需要花费时间或精力,你只需做一次检查,成功率为67%(1.00-0.80^5)=0.67
但是,如果您确实需要成本,或者需要跟踪搜索的数量或类似的内容,下面是我将如何编写代码。很抱歉,我没有更新你的,而是从头开始写,我只是想让事情尽可能简单
breed [ rangers ranger ]
breed [ snares snare ]
to setup
create-snares 100 [
set shape "circle"
set color blue
set size 0.5
move-to one-of patches
]
create-rangers 10 [
set color red
move-to one-of patches
]
end
to go
ask rangers [
move-to one-of neighbors4
; call our procedure with the starting limit of 5
hunt-snares 5
]
end
to hunt-snares [ search-limit ]
; the recursive base case is search-limit of 0
if ( search-limit > 0 ) [
; can only find a snare if one exists here
ifelse random 100 < 20 and any? snares-here [
; found one
ifelse random 100 < 80 [
; disabled
ask one-of snares-here [ die ]
; restart the search
hunt-snares 5
] [
; we found a snare but failed to disable it, unclear what to do?
hunt-snares 5
]
] [
; failed to find one, move towards the base case
hunt-snares (search-limit - 1)
]
]
end
品种[游骑兵游骑兵]
繁殖[圈套]
设置
制造陷阱100[
设置形状“圆”
设置颜色为蓝色
设置大小为0.5
移动到其中一个补丁
]
创建流浪者10[
设置颜色为红色
移动到其中一个补丁
]
结束
外带
问流浪者[
移动到其中一个邻居4
;调用我们的程序,起始限制为5
捕猎陷阱5
]
结束
搜寻陷阱[搜寻限制]
; 递归的基本情况是搜索限制为0
如果(搜索限制>0)[
;只有在这里存在陷阱时才能找到陷阱
如果还有随机100<20和任何陷阱[
找到一个
ifelse随机100<80[
残废
在这里问一个陷阱[死]
;重新开始搜索
捕猎陷阱5
] [
;我们发现了一个陷阱,但未能禁用,不清楚该怎么办?
捕猎陷阱5
]
] [
;找不到,请移到基本案例
狩猎陷阱(搜索限制-1)
]
]
结束
编辑添加:对不起,我认为您的原始代码更复杂,它实际上看起来相对简单,我可能应该修改您的版本。您的热点搜索
过程进入无限循环的原因是snare found?
从未在代码中的任何位置设置为false
。处理递归的典型方法是让递归过程的一个参数向基本情况前进,在这种情况下,最后一个递归调用可以退出,整个调用链也将结束
在这种情况下,我们有两个复杂情况:1)一个隐式的基本情况不是一个参数-补丁上仍然有陷阱要解除,2)我们可以将参数重置到离基本情况更远的地方,知道第1项意味着我们不会循环。我不理解您对所需过程的英语描述。你能定义什么构成“相同的程序”和什么构成“正常的行为”吗?@WadeSchuette你说得很对。我已经澄清了这个问题。