【问题标题】:Iterating through a list in Netlogo遍历 Netlogo 中的列表
【发布时间】:2021-04-12 23:12:33
【问题描述】:

在这里旋转我的轮子!

  • 我正在使用一个 20K 节点网络,我想将其放入 NetLogo(最终目标是对模型库的简单病毒式营销模型进行旋转)(让它工作得很好!)

  • 我已经使用 Python 预先准备了我想在 Netlogo 中工作的特定节点。例如,这是我的图中按中介中心性排列的前 20 个节点的列表: 设置节点列表[“73647”“52658”“78667”“97632”“22987”“101425”“97788”“15439”“46269”“45942”“46016”“95372”“83259”“22757”“91392”“101355” " "12915" "905" "95940" "88071"]

  • 这些节点代表我的图中按降序排列的前 20 个节点 通过中介中心性(Python Networkx 中大约 25 分钟到 得到这个)

所以,我想做的是:

  1. 对于一个称为预算 (n,0-19) 的任意数字,取第一个 n
    node_ids from nodelist(海龟自己的变量node_id)

  2. 查找与node_id匹配的对应Who

  3. 按 Who number 询问海龟做某事,例如,[set take? = 真的]

非常感谢任何帮助或建议!

【问题讨论】:

  • 您是否真的尝试过具有 20000 个节点的简单病毒式营销模型?网络扩展在计算介数方面可能与 Python 的 Networkx 一样快,然后您可以简单地使用 max-n-of 创建代理集,而不是使用 who 数字列表
  • 不幸的是,我发现 NetLogo 网络扩展在计算中间分数时比 Networkx 慢了几个数量级。使用 NetworkX 25 分钟,4 小时后放弃 NetLogo 计算。

标签: netlogo


【解决方案1】:

您可以通过多种不同的方式查看列表。 一种是使用“foreach”命令。 另一种是对索引号使用显式循环,从零开始。

这是他们两个的演示。 “设置”运行设置 “go”一旦找到项目并将它们变大并显示它们的标签 “去”再次使它们再次变小。

globals [ NUMTURTLES BUDGET NODELISTSIZE nodelist ]
turtles-own [ adopt?  node_id]

to setup
  clear-all
  let rseed random 999999;
  print (word "random seed being used for this run is : " rseed );
  random-seed rseed;
  
  ;; globals or sliders, low values to see what's going on
  set BUDGET random  5;  ( 0 to 19 )
  set NUMTURTLES    30;
  set NODELISTSIZE  10; ;; something bigger than BUDGET!
  
  print (word "BUDGET = " BUDGET );
  
  
  create-turtles NUMTURTLES 
      [ setxy random-xcor random-ycor  
        set adopt? false 
        set node_id random 999999
       ]
  
  set nodelist [];
  ask N-of NODELISTSIZE turtles [ set nodelist lput node_id nodelist ]
  show nodelist;
  
  reset-ticks
end

to go
  if ( ticks = 0)
  [    ;; option #1: make a sublist and use the "foreach" command to walk down it
       let worklist sublist nodelist 0 BUDGET
       show worklist
       foreach worklist [ 
             a -> print (word "next item in worklist " a)
         ask one-of turtles with [ node_id = a ] [ set adopt? true set size 3 set label a]
          ]
  ]
  
  ;; undo the above a different way
  
  if ( ticks = 1 )  
  [   ;; option #2:  use effectively for i = 0 to BUDGET to process list item i
      ;; do NOT forget the "set i ( i + 1 )" or this will run forever! 
      let i 0
      repeat BUDGET [
      let b item i nodelist
      print (word "item " i " which is " b " will be undone");
      ask one-of turtles with [ node_id = b ] [ set adopt? false set size 1 ]
      set i ( i + 1 )
      ]
    
  ]
  tick
end

【讨论】:

    猜你喜欢
    • 2018-10-07
    • 2022-01-04
    • 2016-08-27
    • 2011-09-14
    • 2022-11-22
    • 1970-01-01
    • 2010-12-18
    • 2022-01-07
    相关资源
    最近更新 更多