NetLogo:从 NLCD 创建补丁组
NetLogo: Creating patch groups from NLCD
我对 NetLogo 及其编程功能还很陌生。我正在尝试为我的代码创建一个分组机制,以便可以在我的 NetLogo 世界中反映 NLCD 分类。
例如,NLCD 蔬菜类型 11 和 12 用于分类为水域的区域。我不想每次都调用单个蔬菜类型,而是想分配组(例如“water-patches”)来优化我的代码。目前,我的代码非常乏味,因为每个蔬菜都有一个 if
语句-type.
ask patches [
ifelse veg-type > 0
[
if veg-type = 41 ;;NLCD forest gridcodes
[set pcolor 55]
if veg-type = 42
[set pcolor 55]
if veg-type = 43
[set pcolor 55]
if veg-type = 52
[set pcolor 55]
if veg-type = 71 ;;NLCD grass gridcodes
[set pcolor 43]
if veg-type = 90
[set pcolor 43]
if veg-type = 95
[set pcolor 43]
if veg-type = 81 ;;NLCD agriculture gridcodes
[set pcolor orange]
if veg-type = 82
[set pcolor orange]
if veg-type = 21 ;;NLCD urban gridcodes
[set pcolor red]
if veg-type = 22
[set pcolor red]
if veg-type = 23
[set pcolor red]
if veg-type = 24
[set pcolor red]
if veg-type = 11 ;;NLCD water gridcodes
[set pcolor blue]
if veg-type = 12
[set pcolor blue]
if veg-type = 31 ;;NLCD barren gridcode
[set pcolor brown]
]
[set pcolor white]
]
如何为不同的蔬菜类型创建组,以便一个 FOREST 组可以对应蔬菜类型为 41、42、43、52 的补丁?我是否需要创建多个代理集(例如森林补丁、水补丁等)或者我应该 table:put
将蔬菜类型信息放入 table 并使用 table:group-items
命令?
感谢所有意见!
您不需要为此使用表格,您是想创建永久代理集还是根据需要简单地创建取决于您需要多久构建一次。我还建议使用颜色以外的实际变量来定义您的组。例如,稍后您可能希望脏水在视觉上具有不同的颜色,但在程序中仍将这些补丁视为水。而且您不想重写一些东西来取消链接用于显示的颜色与用作补丁类型指示符的颜色。所以,像这样添加一个变量(我称之为 NLCDtype)。你可能已经有了这个用于蔬菜类型,但你想将它们组合成组。
patches-own
[ NLCDtype
]
然后您可以按照以下几行修改您提供的代码块:
ask patches [
ifelse veg-type > 0
[ if member? veg-type [41 42 43 52] ;;NLCD forest gridcodes
[ set pcolor 55
set NLCDtype "forest"
]
if member? veg-type [71 90 95 ] ;;NLCD grass gridcodes
[ set pcolor 43
set NLCDtype "grass"
]
; ... other codes I didn't bother with
[ set pcolor white ]
]
请注意,我在这里做了两件事。 (1) 将同一类型的所有不同值放入一行代码中。我使用 member?
形式,因为它很短,但您也可以使用 or
来组合它们(类似于 if veg-type=41 or veg-type=42 or veg-type=43 [ set...]
)。 (2) 为变量NLCDtype赋值。
然后可以使用组变量来限制代码的应用,比如
ask patches with [NLCDtype = "grass"]
[ set pcolor green
]
这种方法的优点是补丁集是在使用时创建的。例如,如果您的模型中有土地使用变化(因此草变成了农业),那么此构造将始终找到当前类型正确的补丁。
但是,如果您不希望补丁改变类型,您可以创建一些全局变量并设置永久补丁集。这将使您的代码更快,因为补丁集只创建一次。为此:
globals
[ grass-patches
forest-patches
; other names
]
ask patches
[ if veg-type > 0
; all the assigning stuff already discussed
]
; now they all have a group identifier, set the global variable patchsets
set grass-patches patches with [NLCDtype = "grass"]
set ...
我对 NetLogo 及其编程功能还很陌生。我正在尝试为我的代码创建一个分组机制,以便可以在我的 NetLogo 世界中反映 NLCD 分类。
例如,NLCD 蔬菜类型 11 和 12 用于分类为水域的区域。我不想每次都调用单个蔬菜类型,而是想分配组(例如“water-patches”)来优化我的代码。目前,我的代码非常乏味,因为每个蔬菜都有一个 if
语句-type.
ask patches [
ifelse veg-type > 0
[
if veg-type = 41 ;;NLCD forest gridcodes
[set pcolor 55]
if veg-type = 42
[set pcolor 55]
if veg-type = 43
[set pcolor 55]
if veg-type = 52
[set pcolor 55]
if veg-type = 71 ;;NLCD grass gridcodes
[set pcolor 43]
if veg-type = 90
[set pcolor 43]
if veg-type = 95
[set pcolor 43]
if veg-type = 81 ;;NLCD agriculture gridcodes
[set pcolor orange]
if veg-type = 82
[set pcolor orange]
if veg-type = 21 ;;NLCD urban gridcodes
[set pcolor red]
if veg-type = 22
[set pcolor red]
if veg-type = 23
[set pcolor red]
if veg-type = 24
[set pcolor red]
if veg-type = 11 ;;NLCD water gridcodes
[set pcolor blue]
if veg-type = 12
[set pcolor blue]
if veg-type = 31 ;;NLCD barren gridcode
[set pcolor brown]
]
[set pcolor white]
]
如何为不同的蔬菜类型创建组,以便一个 FOREST 组可以对应蔬菜类型为 41、42、43、52 的补丁?我是否需要创建多个代理集(例如森林补丁、水补丁等)或者我应该 table:put
将蔬菜类型信息放入 table 并使用 table:group-items
命令?
感谢所有意见!
您不需要为此使用表格,您是想创建永久代理集还是根据需要简单地创建取决于您需要多久构建一次。我还建议使用颜色以外的实际变量来定义您的组。例如,稍后您可能希望脏水在视觉上具有不同的颜色,但在程序中仍将这些补丁视为水。而且您不想重写一些东西来取消链接用于显示的颜色与用作补丁类型指示符的颜色。所以,像这样添加一个变量(我称之为 NLCDtype)。你可能已经有了这个用于蔬菜类型,但你想将它们组合成组。
patches-own
[ NLCDtype
]
然后您可以按照以下几行修改您提供的代码块:
ask patches [
ifelse veg-type > 0
[ if member? veg-type [41 42 43 52] ;;NLCD forest gridcodes
[ set pcolor 55
set NLCDtype "forest"
]
if member? veg-type [71 90 95 ] ;;NLCD grass gridcodes
[ set pcolor 43
set NLCDtype "grass"
]
; ... other codes I didn't bother with
[ set pcolor white ]
]
请注意,我在这里做了两件事。 (1) 将同一类型的所有不同值放入一行代码中。我使用 member?
形式,因为它很短,但您也可以使用 or
来组合它们(类似于 if veg-type=41 or veg-type=42 or veg-type=43 [ set...]
)。 (2) 为变量NLCDtype赋值。
然后可以使用组变量来限制代码的应用,比如
ask patches with [NLCDtype = "grass"]
[ set pcolor green
]
这种方法的优点是补丁集是在使用时创建的。例如,如果您的模型中有土地使用变化(因此草变成了农业),那么此构造将始终找到当前类型正确的补丁。
但是,如果您不希望补丁改变类型,您可以创建一些全局变量并设置永久补丁集。这将使您的代码更快,因为补丁集只创建一次。为此:
globals
[ grass-patches
forest-patches
; other names
]
ask patches
[ if veg-type > 0
; all the assigning stuff already discussed
]
; now they all have a group identifier, set the global variable patchsets
set grass-patches patches with [NLCDtype = "grass"]
set ...