If statement 我有一个奇怪的问题,在netlogo与一个ifelse声明

If statement 我有一个奇怪的问题,在netlogo与一个ifelse声明,if-statement,netlogo,If Statement,Netlogo,我问一个关于网络标志的问题,因为我正在做一个项目。我正在进行群集模拟,但当我尝试使用ifelse语句刺穿其他行为时,但当我将ifelse语句放入其中时,它们不会跟随任何行为,而是移动 代码如下: breed [Birds Bird] breed [Hawks Hawk] to Setup clear-all reset-ticks create-Birds Number_of_Birds[ setxy random-xcor random-ycor] create-Ha

我问一个关于网络标志的问题,因为我正在做一个项目。我正在进行群集模拟,但当我尝试使用ifelse语句刺穿其他行为时,但当我将ifelse语句放入其中时,它们不会跟随任何行为,而是移动

代码如下:

breed [Birds Bird] breed [Hawks Hawk]

to Setup   clear-all   reset-ticks   create-Birds Number_of_Birds[
    setxy random-xcor random-ycor]   create-Hawks Number_of_Hawks[
    setxy random-xcor random-ycor] end

 to Start   ask Birds[
    set color white
    ifelse (Hawks in-radius Reaction_Distance = 0)
    [
      set heading Migration_Direction
      let closest-Birds max-n-of Target_Group_Size (other Birds) [distance myself]
      let Group_Heading mean [heading] of closest-Birds
      let centroidx mean [xcor] of closest-Birds
      let centroidy mean [ycor] of closest-Birds
      set heading (Migration_Direction +( attraction * (Group_Heading)))
      fd 1
      set heading ( attraction * (towardsxy centroidx centroidy) )
      fd 1
    ]
    [
      let Closest_Hawks max-n-of 1 (Hawks) [distance myself]
      set heading (mean [heading] of Closest_Hawks + 180)
      fd 1
    ]   ] end

让我们看看NetLogo字典中的定义:

报告一个agentset,该agentset仅包括原始agentset中与调用者的距离小于或等于number的代理

它说在radius中报告了一个代理集

现在让我们来看看你的Ifter条件:

ifelse (Hawks in-radius Reaction_Distance = 0)
定义告诉我们,半径范围内的鹰反应距离部分报告一个代理集,即半径范围内的所有鹰。然后,=符号将该代理集与数字0进行比较。但是代理集不是一个数字!它永远不可能等于零

我想你想要的是比较半径内鹰的数量和0的数量

一种方法是使用原语,该原语报告agentset中的代理数:

ifelse (count Hawks in-radius Reaction_Distance = 0)
那会有用的,但我不会那样写。NetLogo具有更好的原语,您可以这样使用:

ifelse (not any? Hawks in-radius Reaction_Distance)
这以更清晰的方式表达了你的意图

您还可以颠倒ifelse子句的顺序,以避免出现以下情况:


让我们看看NetLogo字典中的定义:

报告一个agentset,该agentset仅包括原始agentset中与调用者的距离小于或等于number的代理

它说在radius中报告了一个代理集

现在让我们来看看你的Ifter条件:

ifelse (Hawks in-radius Reaction_Distance = 0)
定义告诉我们,半径范围内的鹰反应距离部分报告一个代理集,即半径范围内的所有鹰。然后,=符号将该代理集与数字0进行比较。但是代理集不是一个数字!它永远不可能等于零

我想你想要的是比较半径内鹰的数量和0的数量

一种方法是使用原语,该原语报告agentset中的代理数:

ifelse (count Hawks in-radius Reaction_Distance = 0)
那会有用的,但我不会那样写。NetLogo具有更好的原语,您可以这样使用:

ifelse (not any? Hawks in-radius Reaction_Distance)
这以更清晰的方式表达了你的意图

您还可以颠倒ifelse子句的顺序,以避免出现以下情况: