如何将世界划分为特定大小的区域?
How to divide world in regions of specific size?
我在构建模型时遇到问题:我正在尝试构建一个农业区,其中特定数量的农民拥有不同大小的土地(也是特定的,而不是随机的)。在农民的财产里,有田地(黄色斑块)和森林(绿色斑块)。
这里有一些代码:
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
使用这段代码我遇到了这些问题:
- 并不是所有的农民都是被创造出来的。
- 属性在黑色中漂浮space,相距甚远
我如何改进(或完全革新)我的代码?
这有几个明显的问题。第一个是通用的 NetLogo 位:
- 使用
in-radius-nowrap
向我建议你有世界环绕并且真的不希望它环绕,因为它是陆地并且环绕没有意义。您可以使用界面上的设置按钮(右上角)关闭环绕,您还可以在其中设置世界上的补丁数量。
- 如果你想创建(比如说)10 个农民,你不需要做
repeat 10 [create-farmers 1 ...
,你只需一次创建 10 个。 [] 中设置 属性 的所有代码都将发生在每个农民身上,因为它是创建块的一部分。
neighbors
已经是补丁集,但我怀疑您还想包含中央补丁
你的具体问题是房产太少,距离太远 - 事实上,所有的农民和他们的房产都在创建,但他们的房产没有被着色。您的代码创建了一个农民并给了他们 属性,但只有在 属性 不重叠时才给它上色。
因此,要解决此问题,您只需要在有 space 的地方创建农场。首先创建较大的农场可能更容易,然后较小的农场可以填补空白。不过,查看您的代码,所有农场的大小都相同 (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
我在构建模型时遇到问题:我正在尝试构建一个农业区,其中特定数量的农民拥有不同大小的土地(也是特定的,而不是随机的)。在农民的财产里,有田地(黄色斑块)和森林(绿色斑块)。
这里有一些代码:
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
使用这段代码我遇到了这些问题:
- 并不是所有的农民都是被创造出来的。
- 属性在黑色中漂浮space,相距甚远
我如何改进(或完全革新)我的代码?
这有几个明显的问题。第一个是通用的 NetLogo 位:
- 使用
in-radius-nowrap
向我建议你有世界环绕并且真的不希望它环绕,因为它是陆地并且环绕没有意义。您可以使用界面上的设置按钮(右上角)关闭环绕,您还可以在其中设置世界上的补丁数量。 - 如果你想创建(比如说)10 个农民,你不需要做
repeat 10 [create-farmers 1 ...
,你只需一次创建 10 个。 [] 中设置 属性 的所有代码都将发生在每个农民身上,因为它是创建块的一部分。 neighbors
已经是补丁集,但我怀疑您还想包含中央补丁
你的具体问题是房产太少,距离太远 - 事实上,所有的农民和他们的房产都在创建,但他们的房产没有被着色。您的代码创建了一个农民并给了他们 属性,但只有在 属性 不重叠时才给它上色。
因此,要解决此问题,您只需要在有 space 的地方创建农场。首先创建较大的农场可能更容易,然后较小的农场可以填补空白。不过,查看您的代码,所有农场的大小都相同 (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