使用map比较Netlogo中的列表

使用map比较Netlogo中的列表,netlogo,Netlogo,假设为每个节点分配了一个列表,例如[1 0 0 1](节点拥有变量“state”)。我试图比较两个连接节点的列表,以确定它们的一致性,然后对于给定节点,确定哪个连接节点的状态与其自身的状态最相似。最后,我想让节点更新另一个变量(“answer”,即1或0)的值,使其与最近匹配节点的答案相同 为了比较两个节点的列表,我想减去它们并取绝对值,然后将其设置为连接这两个节点的链接的“一致”分数。所以对于减法,我试着: ask links [ let subtracted-list (map - stat

假设为每个节点分配了一个列表,例如[1 0 0 1](节点拥有变量“state”)。我试图比较两个连接节点的列表,以确定它们的一致性,然后对于给定节点,确定哪个连接节点的状态与其自身的状态最相似。最后,我想让节点更新另一个变量(“answer”,即1或0)的值,使其与最近匹配节点的答案相同

为了比较两个节点的列表,我想减去它们并取绝对值,然后将其设置为连接这两个节点的链接的“一致”分数。所以对于减法,我试着:

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 0 1 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
由于您希望在多对节点上比较此减法(或者实际上是绝对差的总和),因此最好将其设置为报告器。这样,您就可以使用报告器的结果作为语句的
minone的输入

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
请注意,我使用#来开始参数名称,这是一种个人约定,但我认为这使代码更容易理解,因为您可以看到传递给reporter过程的内容。另外请注意,如果您不关心可读性,可以将其作为一行来完成:

report reduce + map abs (map - #list1 #list2)
如果您不想使用reporter过程版本,这也解决了如何扩展代码以进行绝对差异之和的问题:

let bitdiff reduce + map abs (map - [state] of end1 [state] of end2)

如果您给出一些示例输入和预期输出以减少歧义,那么这些问题就更容易回答。但是,我认为您的问题只是没有使用[]来提取状态值。看看这个完整的模型:

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
由于您希望在多对节点上比较此减法(或者实际上是绝对差的总和),因此最好将其设置为报告器。这样,您就可以使用报告器的结果作为
语句的
minone的输入

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
请注意,我使用#来开始参数名称,这是一种个人约定,但我认为这使代码更容易理解,因为您可以看到传递给reporter过程的内容。另外请注意,如果您不关心可读性,可以将其作为一行来完成:

report reduce + map abs (map - #list1 #list2)
如果您不想使用reporter过程版本,这也解决了如何扩展代码以进行绝对差异之和的问题:

let bitdiff reduce + map abs (map - [state] of end1 [state] of end2)

您可以将
set state[]repeat 4[set state lput one of[0 1]state]
替换为
set state n-values 4[one of[0 1]]
reduce+
替换为
sum
。感谢您的建议。由于某种原因,我仍然会犯同样的错误,而且似乎不知道为什么。我还添加了代码以获得更多上下文。这是一个微妙的错误。如果打印#list1和#list2,您将看到它们看起来像带双括号的[[0 1 0 1]]。设置状态时,需要
设置状态n值num state elem[random 2]
。通过输入
列表
原语,实际上创建的是一个单项目列表,该项目就是一个列表
n-values
已经构建了一个列表。您可以将
set state[]repeat 4[set state lput[01]state]中的一个替换为
set state n-values 4[01]中的一个]
reduce+
替换为
sum
。感谢您的建议。由于某种原因,我仍然会犯同样的错误,而且似乎不知道为什么。我还添加了代码以获得更多上下文。这是一个微妙的错误。如果打印#list1和#list2,您将看到它们看起来像带双括号的[[0 1 0 1]]。设置状态时,需要
设置状态n值num state elem[random 2]
。通过输入
列表
原语,实际上创建的是一个单项目列表,该项目就是一个列表<代码>n值
已经构建了一个列表。