Recursion NetLogo中的递归

Recursion NetLogo中的递归,recursion,netlogo,Recursion,Netlogo,在NetLogo 6.1.1中,我有一个品种(游骑兵)在绿草地(灌木丛)寻找另一个品种(陷阱) 我无法理解的行为是: 如果发现陷阱,移除陷阱的成功率为80%;然后 重复相同的过程(热点搜索;递归调用) 如果未发现陷阱(20%概率),则重复相同的步骤 过程(热点搜索;注释掉的部分->导致无休止的循环)5次 如果这5次没有清除陷阱,则恢复正常行为(随机右转并向前移动1) 我该怎么做 ;; globals ========================= breed [rangers ranger]

在NetLogo 6.1.1中,我有一个品种(游骑兵)在绿草地(灌木丛)寻找另一个品种(陷阱)

我无法理解的行为是:

  • 如果发现陷阱,移除陷阱的成功率为80%;然后 重复相同的过程(热点搜索;递归调用)
  • 如果未发现陷阱(20%概率),则重复相同的步骤 过程(热点搜索;注释掉的部分->导致无休止的循环)5次

  • 如果这5次没有清除陷阱,则恢复正常行为(随机右转并向前移动1)

  • 我该怎么做

    ;; 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你说得很对。我已经澄清了这个问题。