嵌套 if 补丁上下文 NetLogo 中的查询
Nested if queries in patch context NetLogo
我想在这些条件下将补丁颜色更改为绿色:
-如果在同一列上有任何两个蓝色补丁并且它们的距离小于 25 AND
-如果在同一列上和这些选定的蓝色补丁之间有任何黄色补丁
-然后将满足这些条件的所有patch的颜色变为绿色。
我在 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]]
你接近它的方式,你需要相当复杂的陈述,如:
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]
我相信从您希望潜在变绿的补丁的角度来看,这会容易得多。如果我正确解释了您的条件,则该补丁需要计算出最接近的黄色补丁 above/below/at,然后检查是否有两个蓝色补丁将黄色和自身包围起来,并且蓝色补丁彼此足够接近。我假设你关闭了包装。
这是一个完整的模型,它放入了一只红海龟而不是将补丁变成绿色,这样您就可以看到它是否识别了正确的补丁。
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]
。
此代码以随机顺序检查每个补丁,并在条件满足时将其添加到补丁集(称为变绿)。一旦所有的补丁都经过测试,选定的补丁集就会改变它们的颜色。这避免了黄色或蓝色补丁变成绿色并且不可用于以后的补丁检查的问题。
我想在这些条件下将补丁颜色更改为绿色:
-如果在同一列上有任何两个蓝色补丁并且它们的距离小于 25 AND
-如果在同一列上和这些选定的蓝色补丁之间有任何黄色补丁
-然后将满足这些条件的所有patch的颜色变为绿色。
我在 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]]
你接近它的方式,你需要相当复杂的陈述,如:
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]
我相信从您希望潜在变绿的补丁的角度来看,这会容易得多。如果我正确解释了您的条件,则该补丁需要计算出最接近的黄色补丁 above/below/at,然后检查是否有两个蓝色补丁将黄色和自身包围起来,并且蓝色补丁彼此足够接近。我假设你关闭了包装。
这是一个完整的模型,它放入了一只红海龟而不是将补丁变成绿色,这样您就可以看到它是否识别了正确的补丁。
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]
。
此代码以随机顺序检查每个补丁,并在条件满足时将其添加到补丁集(称为变绿)。一旦所有的补丁都经过测试,选定的补丁集就会改变它们的颜色。这避免了黄色或蓝色补丁变成绿色并且不可用于以后的补丁检查的问题。