2

我正在 NetLogo 中创建鱼缸式模拟。有“猎物”、“捕食者”和“隐藏点”。

这个想法是,当捕食者出现在地图上时,猎物将单独运行“隐藏”行为并前往最近的“隐藏点”——前提是它和“隐藏点”之间没有掠食者。

to move-turtles
  ask prey  [
    if (any? predators)
    [
      hide
      stop
    ]

运行隐藏命令的相关代码。

to hide
  face min-one-of hidingspot [distance myself]  
  set d distance min-one-of hidingspot [distance myself]
  ask patches in-cone d 80
  [ set pcolor yellow
    if (any? predators-here)
    [ ask prey
      [ forward 1
        set color red 
        output-print "DANGER"]]]
    forward 1
end

问题是我不知道如何正确使用“询问补丁”中的 if 语句。因此,当一个猎物发现威胁时,所有猎物都在运行语句的 else 部分,而不是单独评估它。

我将如何解决这个问题?

任何帮助表示赞赏。

4

2 回答 2

2

你需要将你要求猎物做的事情与你要求补丁做的事情分开。正如 King-Ink 所说,您是在要求补丁要求所有猎物做事。

最简单的方法是为“危险”补丁创建补丁集,然后检查这些补丁上是否有捕食者。为此,您需要类似以下的内容(请注意,这是一个完整的模型,因此您可以将整个代码复制到一个新模型中并运行它)。

我清理了您代码中的其他一些内容。我用于let局部变量 d 以便它不必出现在您的全局变量中。我min-one-of只要求了一次并重复使用,因为否则每次都可以选择不同的隐藏点(如果在相同距离处有多个)。虽然这一次不会导致错误(因为第二次选择只是为了找到距离,根据定义,它是相同的),但这是一种很好的做法。

breed [prey a-prey]
breed [predators predator]
breed [hidingspots hidingspot]

to setup
  clear-all
  create-predators 1 [setxy random-xcor random-ycor set color red]
  create-prey 5 [setxy random-xcor random-ycor set color brown]
  create-hidingspots 20
  [ setxy random-xcor random-ycor
    hide-turtle
    ask patch-here [set pcolor green]
  ]
  reset-ticks
end

to go
  ifelse any? predators
    [ ask prey [hide] ]
    [ ask prey [swim] ]
end

to hide                                      ; turtle procedure
  let target min-one-of hidingspots [distance self]
  let path patches in-cone distance target 80
  ask path [ set pcolor yellow ]
  if any? predators-on path
  [ set color red 
    output-print "DANGER"
    face target 
  ]
  forward 1
end

to swim
end
于 2015-11-12T15:58:21.053 回答
1

您是在要求每个猎物要求所有猎物隐藏。如果您从命令中删除询问猎物,所有猎物都在运行,它应该可以正常工作并且速度会更快一些

to hide
   face min-one-of hidingspot [distance myself]  
   set d distance min-one-of hidingspot [distance myself]
   ask patches in-cone d 80
     [set pcolor yellow]
   if (any? predators-here)
    [ 
      forward 1
      set color red 
      output-print "DANGER"
    ] 
end
于 2015-11-12T14:44:54.633 回答