Netlogo 如何在网格中随机删除块边?

Netlogo 如何在网格中随机删除块边?,netlogo,Netlogo,接下来,我想随机删除网格中的块边。以下是我的想法: %%第一次,我在网格中随机选择了一个白色补丁(下图): %%然后,我绘制红色面片以识别白色道路之间的交叉点(下图): %%最后,我将位于两个红色斑块之间且与随机斑块位于同一侧的所有白色斑块涂成棕色。为了识别这些白色斑块,我必须计算随机斑块和最近的红色斑块之间的距离,并为沿着这些距离的所有白色斑块着色吗 提前感谢你的帮助 思考问题的另一种方法是寻找白色斑块簇:随机选取一个白色斑块,并希望将所有相邻的白色斑块变成棕色 您可以查看NetLogo模型库

接下来,我想随机删除网格中的块边。以下是我的想法:

%%第一次,我在网格中随机选择了一个白色补丁(下图):

%%然后,我绘制红色面片以识别白色道路之间的交叉点(下图):

%%最后,我将位于两个红色斑块之间且与随机斑块位于同一侧的所有白色斑块涂成棕色。为了识别这些白色斑块,我必须计算随机斑块和最近的红色斑块之间的距离,并为沿着这些距离的所有白色斑块着色吗

提前感谢你的帮助


思考问题的另一种方法是寻找白色斑块簇:随机选取一个白色斑块,并希望将所有相邻的白色斑块变成棕色

您可以查看NetLogo模型库的代码示例部分中的“补丁群集示例”,了解一种方法

我会这样做的。让我们首先定义一个
grow集群
reporter:

to-report grow-cluster [ current-cluster new-patch ]
  let patches-to-add [
    neighbors4 with [
      pcolor = [ pcolor ] of myself and
      not member? self current-cluster
    ]
  ] of new-patch
  let new-cluster (patch-set current-cluster new-patch)
  report ifelse-value any? patches-to-add
    [ reduce grow-cluster fput new-cluster sort patches-to-add ]
    [ new-cluster ]
end
如果您不习惯函数式编程,代码可能很难理解,因为它在调用中使用。但简而言之,它:

  • 获取现有修补程序群集和要添加到此群集的新修补程序
  • 查找也应添加到群集的新修补程序的邻居,即颜色相同但不属于群集的邻居
  • 调用自己添加这些新补丁,以便可以将它们的邻居添加到集群(以及这些邻居的邻居,等等),直到找不到新补丁为止
一旦您拥有了
grow cluster
,您就可以使用它来完成您想要的任务,方法是使用一个空簇和您选择的随机补丁对其进行种子设定:

to remove-random-side
  let random-patch one-of patches with [pcolor = white]
  let side grow-cluster no-patches random-patch
  ask side [ set pcolor brown ]
end

请注意:在这个模型中,世界包装必须在你的模型设置中被禁用。

< P>因为你正在制作一个统一的网格,你可能只考虑在<代码> PXCOR < /代码>和<代码> Pycor < /代码>上做数学,而不是采取补丁集群示例方法。这种方法最适合处理不规则形状

要设置网格,只需执行以下操作:

ask patches [
  set pcolor brown
  let horizontal-street? pycor mod (side + 1) = 0
  let vertical-street? pxcor mod (side + 1) = 0
  if horizontal-street? or vertical-street?
    [ set pcolor white ]
  if horizontal-street? and vertical-street?
    [ set pcolor red ]
]
to remove-random-side
  let random-patch one-of patches with [pcolor = white]
  let side grow-cluster no-patches random-patch
  ask side [ set pcolor brown ]
end
ask patches [
  set pcolor brown
  let horizontal-street? pycor mod (side + 1) = 0
  let vertical-street? pxcor mod (side + 1) = 0
  if horizontal-street? or vertical-street?
    [ set pcolor white ]
  if horizontal-street? and vertical-street?
    [ set pcolor red ]
]