【问题标题】:Using map to compare lists in Netlogo使用地图比较 Netlogo 中的列表
【发布时间】:2020-03-28 13:32:23
【问题描述】:

假设每个节点都分配了一个列表,例如[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 1 0 0 1 0]。”

【问题讨论】:

    标签: netlogo


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 您可以将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]]。设置状态时需要set state n-values num-state-elem [random 2]。通过放入list 原语,您实际上是在创建一个单项列表,而该项就是一个列表。 n-values 已经构建了一个列表。
    猜你喜欢
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多