【问题标题】:Nested if queries in patch context NetLogo嵌套 if 查询在补丁上下文 NetLogo
【发布时间】:2020-05-28 10:35:29
【问题描述】:

我想在这些条件下将补丁的颜色更改为绿色:

-如果同一列上有任意两个蓝色块并且它们的距离小于25 AND

-如果同一列上以及这些选定的蓝色补丁之间有任何黄色补丁

-然后将满足这些条件的所有补丁的颜色更改为绿色。

我正在努力在 NetLogo 中实现它,尝试使用嵌套循环但找不到方法。感谢您的任何帮助。我添加了一个我想要实现的示例图像并标记了示例蓝色补丁。

另外,显示我想在代码中做什么(对不起代码):

     if any? patches with [pcolor = blue and
      (if any? patches with [pcolor = blue and pycor = ?(selected_first_blue's_pycor)
        if any? patches with [pcolor = yellow and pycor < ??(selected_first_blue's_pycor) and pycor > ?(selected_second_blue's_pycor)))
    [ask patches [set pcolor green]]

【问题讨论】:

  • 请发布您尝试过的内容并解释其中的问题。
  • 添加了一个代码示例,只是为了展示我的逻辑。如果不适合NetLogo结构,有没有其他方法可以制作?

标签: netlogo


【解决方案1】:

按照您的处理方式,您需要相当复杂的语句,例如:

let upper-blues patches with [color = blue and
   any? other patches with [color = blue and pxcor = [pxcor] of myself
        and pycor < [pycor] of myself and pycor > [pycor] of myself - 25]

我相信,从您希望可能变为绿色的补丁的角度来看,这会更容易。如果我正确解释了您的条件,则该补丁需要在上方/下方/处计算出最接近的黄色补丁,然后检查是否有两个蓝色补丁将黄色和自身包围起来,并且蓝色补丁彼此足够接近。我假设你已经关闭了换行。

这是一个完整的模型,它放入了一只红色海龟,而不是把补丁变成绿色,这样你就可以看到它是否正在识别正确的补丁。

to setup
  clear-all
  ask patches [set pcolor white]
  ask n-of 100 patches [set pcolor blue]
  ask n-of 100 patches [set pcolor yellow]
end

to convert-to-green
  let turn-green nobody
  ask patches
  [ let my-column patches with [pxcor = [pxcor] of myself]
    let above-yellow min-one-of my-column with [pcolor = yellow and pycor >= [pycor] of myself][pycor]
    let above-blue ifelse-value (above-yellow != nobody) [min-one-of my-column with [pcolor = blue and pycor > [pycor] of above-yellow][pycor]][nobody]
    let below-yellow max-one-of my-column with [pcolor = yellow and pycor <= [pycor] of myself][pycor]
    let below-blue ifelse-value (below-yellow != nobody) [max-one-of my-column with [pcolor = blue and pycor < [pycor] of below-yellow][pycor]][nobody]
    if above-blue != nobody and below-blue != nobody and ([pycor] of above-blue - [pycor] of below-blue < 25)
    [ set turn-green (patch-set self turn-green)
    ]
  ]
  ask turn-green [sprout 1 [set color red]]
end

如果您对它正常工作感到满意,请将ask turn-green [sprout 1 [set color red]] 更改为ask turn-green [set pcolor green]

此代码以随机顺序检查每个补丁,如果满足条件,则将其添加到补丁集(称为变绿)中。一旦所有的补丁都被测试过,一组选定的补丁就会改变它们的颜色。这避免了黄色或蓝色补丁变为绿色并且无法供以后的补丁检查的问题。

【讨论】:

  • 感谢您的快速回复和代码。我试过了,缺少括号并添加(如果有)?在“询问补丁”中的每个“让”代码之前检查。但是,这一次需要在添加的检查中再次检查分配的补丁。例如,此行中的“黄色以下”补丁没有给出任何错误:“如果有的话?带有 [pcolor = blue and pycor
  • "set turn-green patch-set self turn-green"- 错误:需要一个命令。此外,我在之前的评论中所说的条件也会发生同样的事情。谢谢。
  • 我试过编辑版。我的意思是当例如“above-yellow”为空时它会给出错误:“ANY?预期的输入是一个代理集但没有得到NOBODY”。我希望我能解释一下我的意思。
  • 我可以通过一一考虑每一列并使用您的“上,下”想法来解决它。感谢您的帮助和时间。但是我找不到您的代码的问题,这似乎可以用很少的行代码解决问题,或者我无法运行它。无论如何,感谢您的帮助和指导。
  • 好的,我已经以可以测试代码的方式完成了。它似乎工作正常(尽管我确实必须修复一些括号)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多