在 Netlogo 中使用地图比较列表
Using map to compare lists in Netlogo
假设给每个节点分配了一个列表,比如[1 0 0 1](nodes-own variable 'state')。我正在尝试比较两个连接节点的列表以确定它们同意多少,然后对于给定节点决定哪个连接节点具有与其自身最相似的状态。最后,我想让节点为另一个变量('answer',即 1 或 0)更新它们的值,使其与最接近的匹配节点的答案相同。
为了比较两个节点的列表,我想将它们相减并取绝对值,并将其设置为连接两者的 link 的 'agreement' 分数。所以对于减法,我试过:
ask links [
let subtracted-list (map - state of end1 state of end2) ...]
但我在这里遇到一个运行时错误,提示“- 预期输入是一个数字,但得到的是列表”。然后我打算类似地使用 map 取结果列表的绝对值并求和,但我似乎被困在这里,无法弄清楚出了什么问题。
编辑:
我已经尝试采纳这些建议,但出于某种原因,我仍然无法让它发挥作用。这是代码:
breed [nodes node]
nodes-own [state]
links-own [agreement-score]
to setup
clear-all
set-default-shape nodes "circle"
ask patches [ set pcolor black ]
repeat num-nodes [ make-node ]
create-network
distribute-state
repeat 100 [ layout ]
reset-ticks
end
;; Distributing state values to each node (ex. [0 1 0 0 1 0 0 1])
to distribute-state
ask nodes [
set state (list n-values num-state-elem [random 2])
]
end
;; Network formation - Preferential attachment from the Models Library
to make-node
create-nodes 1 [
rt random-float 360
fd max-pxcor
set size 1.5
]
end
to create-network
let partner nobody
let first-node one-of nodes
let second-node one-of nodes with [self != first-node]
ask first-node [ create-link-with second-node [ set color white ] ]
let new-node one-of nodes with [not any? link-neighbors]
while [new-node != nobody] [
set partner find-partner
ask new-node [ create-link-with partner [ set color white ] ]
layout
set new-node one-of nodes with [not any? link-neighbors]
]
end
to update-color
end
;; Go procedures
to go
ask links [calculate-agreement-score]
ask nodes [update-color]
tick
end
to calculate-agreement-score
ask links [
set agreement-score bit-difference [state] of end1 [state] of end2
]
end
to-report bit-difference [#list1 #list2]
let subtraction (map - #list1 #list2)
report reduce + map abs subtraction
end
;; Making the network
to-report find-partner
let pick random-float sum [count link-neighbors] of (nodes with [any? link-neighbors])
let partner nobody
ask nodes
[if partner = nobody
[ ifelse count link-neighbors > pick
[ set partner self]
[ set pick pick - (count link-neighbors)]
]
]
report partner
end
to layout
layout-spring (nodes with [any? link-neighbors]) links 0.4 6 1
end
这仍然给我相同的错误消息:“- 预期输入是一个数字,但得到的是列表 [1 0 1 1 1 1 0 0 1 0]。”
如果您提供一些示例输入和预期输出以减少歧义,这类问题会更容易回答。但是,我认为你的问题只是你没有使用 [] 来提取状态值。看看这个完整的模型:
turtles-own [state]
to testme
clear-all
create-turtles 2
[ set state []
repeat 4 [set state lput one-of [0 1] state]
show state
]
type "subtraction is: " print (map - [state] of turtle 0 [state] of turtle 1)
end
既然你想在多对节点上比较这个减法(或者实际上是绝对差的总和),最好将它设置为报告器。这样,您就可以将报告者的结果用作 min-one-of
语句的输入。
turtles-own [state]
to testme
clear-all
create-turtles 2
[ set state []
repeat 4 [set state lput one-of [0 1] state]
show state
]
type "subtraction is: " print (map - [state] of turtle 0 [state] of turtle 1)
type "difference is: " print bit-difference [state] of turtle 0 [state] of turtle 1
end
to-report bit-difference [#list1 #list2]
let subtraction (map - #list1 #list2)
report reduce + map abs subtraction
end
请注意,我使用 # 开始参数名称,这是个人约定,但我认为这样可以使代码更易于理解,因为您可以看到传递给报告程序的内容。另请注意,如果您不关心可读性,这可以作为单行完成:
report reduce + map abs (map - #list1 #list2)
这也回答了如果您不想使用报告程序版本,如何扩展您的代码来计算绝对差的总和:
let bitdiff reduce + map abs (map - [state] of end1 [state] of end2)
假设给每个节点分配了一个列表,比如[1 0 0 1](nodes-own variable 'state')。我正在尝试比较两个连接节点的列表以确定它们同意多少,然后对于给定节点决定哪个连接节点具有与其自身最相似的状态。最后,我想让节点为另一个变量('answer',即 1 或 0)更新它们的值,使其与最接近的匹配节点的答案相同。
为了比较两个节点的列表,我想将它们相减并取绝对值,并将其设置为连接两者的 link 的 'agreement' 分数。所以对于减法,我试过:
ask links [
let subtracted-list (map - state of end1 state of end2) ...]
但我在这里遇到一个运行时错误,提示“- 预期输入是一个数字,但得到的是列表”。然后我打算类似地使用 map 取结果列表的绝对值并求和,但我似乎被困在这里,无法弄清楚出了什么问题。
编辑:
我已经尝试采纳这些建议,但出于某种原因,我仍然无法让它发挥作用。这是代码:
breed [nodes node]
nodes-own [state]
links-own [agreement-score]
to setup
clear-all
set-default-shape nodes "circle"
ask patches [ set pcolor black ]
repeat num-nodes [ make-node ]
create-network
distribute-state
repeat 100 [ layout ]
reset-ticks
end
;; Distributing state values to each node (ex. [0 1 0 0 1 0 0 1])
to distribute-state
ask nodes [
set state (list n-values num-state-elem [random 2])
]
end
;; Network formation - Preferential attachment from the Models Library
to make-node
create-nodes 1 [
rt random-float 360
fd max-pxcor
set size 1.5
]
end
to create-network
let partner nobody
let first-node one-of nodes
let second-node one-of nodes with [self != first-node]
ask first-node [ create-link-with second-node [ set color white ] ]
let new-node one-of nodes with [not any? link-neighbors]
while [new-node != nobody] [
set partner find-partner
ask new-node [ create-link-with partner [ set color white ] ]
layout
set new-node one-of nodes with [not any? link-neighbors]
]
end
to update-color
end
;; Go procedures
to go
ask links [calculate-agreement-score]
ask nodes [update-color]
tick
end
to calculate-agreement-score
ask links [
set agreement-score bit-difference [state] of end1 [state] of end2
]
end
to-report bit-difference [#list1 #list2]
let subtraction (map - #list1 #list2)
report reduce + map abs subtraction
end
;; Making the network
to-report find-partner
let pick random-float sum [count link-neighbors] of (nodes with [any? link-neighbors])
let partner nobody
ask nodes
[if partner = nobody
[ ifelse count link-neighbors > pick
[ set partner self]
[ set pick pick - (count link-neighbors)]
]
]
report partner
end
to layout
layout-spring (nodes with [any? link-neighbors]) links 0.4 6 1
end
这仍然给我相同的错误消息:“- 预期输入是一个数字,但得到的是列表 [1 0 1 1 1 1 0 0 1 0]。”
如果您提供一些示例输入和预期输出以减少歧义,这类问题会更容易回答。但是,我认为你的问题只是你没有使用 [] 来提取状态值。看看这个完整的模型:
turtles-own [state]
to testme
clear-all
create-turtles 2
[ set state []
repeat 4 [set state lput one-of [0 1] state]
show state
]
type "subtraction is: " print (map - [state] of turtle 0 [state] of turtle 1)
end
既然你想在多对节点上比较这个减法(或者实际上是绝对差的总和),最好将它设置为报告器。这样,您就可以将报告者的结果用作 min-one-of
语句的输入。
turtles-own [state]
to testme
clear-all
create-turtles 2
[ set state []
repeat 4 [set state lput one-of [0 1] state]
show state
]
type "subtraction is: " print (map - [state] of turtle 0 [state] of turtle 1)
type "difference is: " print bit-difference [state] of turtle 0 [state] of turtle 1
end
to-report bit-difference [#list1 #list2]
let subtraction (map - #list1 #list2)
report reduce + map abs subtraction
end
请注意,我使用 # 开始参数名称,这是个人约定,但我认为这样可以使代码更易于理解,因为您可以看到传递给报告程序的内容。另请注意,如果您不关心可读性,这可以作为单行完成:
report reduce + map abs (map - #list1 #list2)
这也回答了如果您不想使用报告程序版本,如何扩展您的代码来计算绝对差的总和:
let bitdiff reduce + map abs (map - [state] of end1 [state] of end2)