首页 > 解决方案 > 如何将世界划分为特定大小的区域?

问题描述

我在构建模型时遇到了麻烦:我正在尝试构建一个农业区,其中特定数量的农民拥有不同大小的土地(也是特定的,不是随机的)。农庄中有田(黄片)和林(绿片)。

这是一段代码:

breed [Smallfarmers Smallfarmer] Smallfarmers-own [property]
breed [Mediumfarmers Mediumfarmer]
Mediumfarmers-own [property]

to setup
ca

loop [
repeat 50[
  create-Smallfarmers 1 [
    set property [patches in-radius-nowrap 1.5] of one-of patches with [pcolor = black]
  if all? (patch-set [neighbors] of property) [pcolor = black] [
    ask n-of 2 property [set pcolor green]
    ask property with [pcolor != green] [set pcolor yellow]]]] 
  
 repeat 10[
  create-Mediumfarmers 1 [
  set property [patches in-radius-nowrap 2.9] of one-of patches with [pcolor = black]
  if all? (patch-set [neighbors] of property) [pcolor = black] [
    ask n-of 6 property [set pcolor green]
    ask property with [pcolor != green] [set pcolor yellow]]]]
stop]
end

使用此代码,我遇到了这些问题:

如何改进(或彻底改变)我的代码?

标签: netlogopatch

解决方案


这有几个不同的问题。第一个是一般的 NetLogo 位:

  1. Usingin-radius-nowrap向我暗示你已经将世界包裹起来,并且真的不希望它包裹起来,因为它是陆地,​​包裹起来没有意义。您可以使用界面上的设置按钮(右上角)关闭环绕,您还可以在其中设置世界上的补丁数量。
  2. 如果你想创建(比如说)10 个农民,你不需要这样做repeat 10 [create-farmers 1 ...,你只需一次创建 10 个。[ ] 中设置属性的所有代码都将发生在每个农民身上,因为它是 create 块的一部分。
  3. neighbors已经是一个补丁集,但我怀疑你也想包含中央补丁

你的具体问题是太少的属性太远了 - 事实上,所有的农民和他们的属性都在被创建,但他们的属性没有被着色。您的代码创建了一个农民并为他们提供了属性,但只有在属性不重叠时才对其进行着色。

所以要解决这个问题,你需要只在有空间的地方创建农场。首先创建较大的农场可能更容易,然后较小的农场可以填补空白。但是,查看您的代码,所有农场的大小都相同(3x3),不同之处在于有多少字段是绿色或黄色。这是一些创建农场的代码(还要注意它将农民放在农场上)。

breed [farmers farmer]
farmers-own
[ property
]

to setup
  clear-all
  create-farmers 10
  [ let potential-farms patches with [all? (patch-set self neighbors) [pcolor = black]]
    ifelse any? potential-farms
    [ move-to one-of potential-farms
      set property (patch-set patch-here neighbors)
      ask n-of 2 property [set pcolor green]
      ask property with [pcolor != green] [set pcolor yellow]
    ]
    [ print "No space available" ]
  ]
end

推荐阅读