内存:在 table 中存储多个补丁的补丁变量
Memory: storing patch variables in table for multiple patches
我正在创建特定于海龟的 tables,用于存储补丁坐标、模拟年份(全局变量设置为 1、2 或 3,具体取决于刻度计数),以及表示可用的补丁变量资源。
我已经设法编写了一个 table 的代码,该 table 具有当前补丁的这些值,但我一直在尝试对其进行缩放,以便在每个时间步,海龟都会存储这三样东西它的所有相邻补丁。
似乎适用于当前补丁的代码是:
extensions [table]
globals [year]
turtles-own [memory-map]
patches-own [food]
to setup
ca
set year 1
ask patches [set food random 10]
crt 2 [set memory-map table:make]
reset-ticks
end
to go
if ticks = 100 [set year 2]
if ticks = 200 [set year 3]
ask turtles [fd 1 set-memory]
end
to set-memory
let thispatch (list pxcor pycor year); key for table
table:put memory-map thispatch food
end
现在,我尝试使用 foreach 修改此代码以遍历邻居并让设置内存过程适用于每个补丁:
to set-memory
foreach sort neighbors [ x ->
ask x [
let thispatch (list pxcor pycor year)
table:put memory-map thispatch food
]]
end
这最后一点给我一个错误,提示 table:put 只能在 turtle 上下文中使用。
我还尝试先为所有邻居创建一个 coordinates/year 列表:
let thispatch [(list pxcor pycor year) ] of neighbors
有效,但我不知道如何将每组列表输入用作 table 的键。
最后,我需要一个table,其中包含每个相邻补丁的(pxcor pycor year)键和食物值作为每个键的值。非常感谢任何帮助。
我想我明白了。我已经创建了一个独立模型,它更新 table 中相邻补丁的值以及乌龟站立的补丁:
extensions
[
table
]
patches-own
[
id
food
]
turtles-own
[
memory-map
]
to setup
; Assign a specific ID to each patch to act as the key for the table
;(that way you only deal with one value instead of a set of coordinates)
(foreach (sort patches) (n-values (count patches) [i -> i + 1]) [[i _id] -> ask i [set id _id]])
ask patches [set food 100]
crt 1
[
set pcolor yellow ;for visualization purposes
set plabel id ;for visualization purposes
set memory-map table:make ; Create empty table
table:put memory-map ([id] of patch-here) food ;Add key (id) and value (food) of current patch to the table
; Loop asking each of the neighbors to update the table
let patch-memmap memory-map ;so that patches can access the table, otherwise it's only accessible to turtles and it gives an error
foreach sort neighbors [ x ->
ask x [
table:put patch-memmap id food
set pcolor green ;for visualization purposes
set plabel id ;for visualization purposes
]]
set memory-map patch-memmap ;return the new table to the turtle
show memory-map ;check what table looks like
]
end
to go
ask patches [set food 200]
ask turtles
[
move-to one-of neighbors
set food (food * 0.5) ;representing consumption in the current patch
update-memory
]
end
to update-memory
set pcolor red ;for visualization purposes
set plabel id ;for visualization purposes
table:put memory-map ([id] of patch-here) food
let patch-memmap memory-map
foreach sort neighbors [ x ->
ask x [
table:put patch-memmap id food
set pcolor pink
set plabel id
]]
set memory-map patch-memmap
show memory-map
end
我正在创建特定于海龟的 tables,用于存储补丁坐标、模拟年份(全局变量设置为 1、2 或 3,具体取决于刻度计数),以及表示可用的补丁变量资源。
我已经设法编写了一个 table 的代码,该 table 具有当前补丁的这些值,但我一直在尝试对其进行缩放,以便在每个时间步,海龟都会存储这三样东西它的所有相邻补丁。
似乎适用于当前补丁的代码是:
extensions [table]
globals [year]
turtles-own [memory-map]
patches-own [food]
to setup
ca
set year 1
ask patches [set food random 10]
crt 2 [set memory-map table:make]
reset-ticks
end
to go
if ticks = 100 [set year 2]
if ticks = 200 [set year 3]
ask turtles [fd 1 set-memory]
end
to set-memory
let thispatch (list pxcor pycor year); key for table
table:put memory-map thispatch food
end
现在,我尝试使用 foreach 修改此代码以遍历邻居并让设置内存过程适用于每个补丁:
to set-memory
foreach sort neighbors [ x ->
ask x [
let thispatch (list pxcor pycor year)
table:put memory-map thispatch food
]]
end
这最后一点给我一个错误,提示 table:put 只能在 turtle 上下文中使用。
我还尝试先为所有邻居创建一个 coordinates/year 列表:
let thispatch [(list pxcor pycor year) ] of neighbors
有效,但我不知道如何将每组列表输入用作 table 的键。
最后,我需要一个table,其中包含每个相邻补丁的(pxcor pycor year)键和食物值作为每个键的值。非常感谢任何帮助。
我想我明白了。我已经创建了一个独立模型,它更新 table 中相邻补丁的值以及乌龟站立的补丁:
extensions
[
table
]
patches-own
[
id
food
]
turtles-own
[
memory-map
]
to setup
; Assign a specific ID to each patch to act as the key for the table
;(that way you only deal with one value instead of a set of coordinates)
(foreach (sort patches) (n-values (count patches) [i -> i + 1]) [[i _id] -> ask i [set id _id]])
ask patches [set food 100]
crt 1
[
set pcolor yellow ;for visualization purposes
set plabel id ;for visualization purposes
set memory-map table:make ; Create empty table
table:put memory-map ([id] of patch-here) food ;Add key (id) and value (food) of current patch to the table
; Loop asking each of the neighbors to update the table
let patch-memmap memory-map ;so that patches can access the table, otherwise it's only accessible to turtles and it gives an error
foreach sort neighbors [ x ->
ask x [
table:put patch-memmap id food
set pcolor green ;for visualization purposes
set plabel id ;for visualization purposes
]]
set memory-map patch-memmap ;return the new table to the turtle
show memory-map ;check what table looks like
]
end
to go
ask patches [set food 200]
ask turtles
[
move-to one-of neighbors
set food (food * 0.5) ;representing consumption in the current patch
update-memory
]
end
to update-memory
set pcolor red ;for visualization purposes
set plabel id ;for visualization purposes
table:put memory-map ([id] of patch-here) food
let patch-memmap memory-map
foreach sort neighbors [ x ->
ask x [
table:put patch-memmap id food
set pcolor pink
set plabel id
]]
set memory-map patch-memmap
show memory-map
end