使用具有 link 权重的 link 代理集在 NetLogo 中创建邻接矩阵
Using a link agentset that has link weights to create an adjacency matrix in NetLogo
我的理解是link agentset大致相当于一个边列表。在这种情况下,我有 links(其中 3 个品种,但我认为这是无关紧要的)有一个变量,重量,可以是 0 到 1 之间的任何地方。我想存储每个 link agentset 数据在它自己的邻接矩阵中在每个 tick 结束时。意思是,每个 link 权重成为基于 end1 和 end2 海龟的行和列中的条目。我认为实际矩阵(矩阵扩展对象)在这种情况下是最好的,因为这样很容易操作以输出到行为空间或其他任何地方。
有没有优雅的方法来做到这一点?
我能想到的最简单的方法依赖于海龟 who
数字(尽管你可以为你的 end1
和 end2
海龟使用一些其他标识符),所以我我有点担心它。如果您对 python 或 R 感到满意,您可能最好只报告一个嵌套列表(类似于 [[ weight turtle i turtle j ] ... ]
并在事后处理 - 您可以在其中任何一个中将海龟作为行/列名称进行跟踪或类似的环境。但是,这里有一种 in-NetLogo 方法可能适合您的需要:
extensions [ matrix ]
globals [ matrix-list ]
links-own [ weight ]
to setup
ca
ask n-of 5 patches [ sprout 1 ]
ask turtles [
create-links-to n-of 2 other turtles [
set weight precision random-float 1 3
set color weight * 100
]
]
set matrix-list ( list report-matrix )
reset-ticks
end
to go
ask links [
set weight precision ( weight + random-float 0.2 - 0.1 ) 3
if weight < 0 [ set weight 0 ]
if weight > 1 [ set weight 1 ]
]
set matrix-list lput report-matrix matrix-list
tick
end
to-report report-matrix
let n-cr count turtles
let new-mat matrix:make-constant n-cr n-cr -1
ask links [
let from-t [who] of end1
let to-t [who] of end2
matrix:set new-mat from-t to-t weight
]
report new-mat
end
setup
构建一个玩具世界并将第一个矩阵存储在 matrix-list
中 - 类似于:
observer> print matrix:pretty-print-text last matrix-list
[[ -1 0.606 0.337 -1 -1 ]
[ -1 -1 -1 0.478 0.271 ]
[ -1 -1 -1 0.129 0.493 ]
[ -1 0.897 -1 -1 0.076 ]
[ 0.817 0.714 -1 -1 -1 ]]
go
的每个 运行 随机改变每个 link 的权重,但在 运行 宁 [=20= 之后保持矩阵中的位置不变]一次:
observer> print matrix:pretty-print-text last matrix-list
[[ -1 0.692 0.284 -1 -1 ]
[ -1 -1 -1 0.503 0.367 ]
[ -1 -1 -1 0.123 0.571 ]
[ -1 0.856 -1 -1 0 ]
[ 0.756 0.761 -1 -1 -1 ]]
两次:
[[ -1 0.753 0.275 -1 -1 ]
[ -1 -1 -1 0.51 0.35 ]
[ -1 -1 -1 0.111 0.497 ]
[ -1 0.95 -1 -1 0.039 ]
[ 0.852 0.845 -1 -1 -1 ]]
希望这能让您指明正确的方向!
我的理解是link agentset大致相当于一个边列表。在这种情况下,我有 links(其中 3 个品种,但我认为这是无关紧要的)有一个变量,重量,可以是 0 到 1 之间的任何地方。我想存储每个 link agentset 数据在它自己的邻接矩阵中在每个 tick 结束时。意思是,每个 link 权重成为基于 end1 和 end2 海龟的行和列中的条目。我认为实际矩阵(矩阵扩展对象)在这种情况下是最好的,因为这样很容易操作以输出到行为空间或其他任何地方。
有没有优雅的方法来做到这一点?
我能想到的最简单的方法依赖于海龟 who
数字(尽管你可以为你的 end1
和 end2
海龟使用一些其他标识符),所以我我有点担心它。如果您对 python 或 R 感到满意,您可能最好只报告一个嵌套列表(类似于 [[ weight turtle i turtle j ] ... ]
并在事后处理 - 您可以在其中任何一个中将海龟作为行/列名称进行跟踪或类似的环境。但是,这里有一种 in-NetLogo 方法可能适合您的需要:
extensions [ matrix ]
globals [ matrix-list ]
links-own [ weight ]
to setup
ca
ask n-of 5 patches [ sprout 1 ]
ask turtles [
create-links-to n-of 2 other turtles [
set weight precision random-float 1 3
set color weight * 100
]
]
set matrix-list ( list report-matrix )
reset-ticks
end
to go
ask links [
set weight precision ( weight + random-float 0.2 - 0.1 ) 3
if weight < 0 [ set weight 0 ]
if weight > 1 [ set weight 1 ]
]
set matrix-list lput report-matrix matrix-list
tick
end
to-report report-matrix
let n-cr count turtles
let new-mat matrix:make-constant n-cr n-cr -1
ask links [
let from-t [who] of end1
let to-t [who] of end2
matrix:set new-mat from-t to-t weight
]
report new-mat
end
setup
构建一个玩具世界并将第一个矩阵存储在 matrix-list
中 - 类似于:
observer> print matrix:pretty-print-text last matrix-list
[[ -1 0.606 0.337 -1 -1 ]
[ -1 -1 -1 0.478 0.271 ]
[ -1 -1 -1 0.129 0.493 ]
[ -1 0.897 -1 -1 0.076 ]
[ 0.817 0.714 -1 -1 -1 ]]
go
的每个 运行 随机改变每个 link 的权重,但在 运行 宁 [=20= 之后保持矩阵中的位置不变]一次:
observer> print matrix:pretty-print-text last matrix-list
[[ -1 0.692 0.284 -1 -1 ]
[ -1 -1 -1 0.503 0.367 ]
[ -1 -1 -1 0.123 0.571 ]
[ -1 0.856 -1 -1 0 ]
[ 0.756 0.761 -1 -1 -1 ]]
两次:
[[ -1 0.753 0.275 -1 -1 ]
[ -1 -1 -1 0.51 0.35 ]
[ -1 -1 -1 0.111 0.497 ]
[ -1 0.95 -1 -1 0.039 ]
[ 0.852 0.845 -1 -1 -1 ]]
希望这能让您指明正确的方向!