在 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)