从 Netlogo 社交网络创建边缘列表

Creating edge list from Netlogo social network

我对 Netlogo 还很陌生,一直在用它做基本的网络分析。我创建了一个由 5 种不同海龟品种组成的社交网络。为了在另一个程序中继续我的分析,我需要创建一个边缘列表(网络中所有连接节点的两列列表)。因此第一列将包含品种和编号(例如 Actor 1),第二列将列出 Actor 1 的联系人之一 (例如 [演员 1,演员 2] [演员 1,导演 5] [演员 1,制片人 1].........) 输出需要是 txt 或 csv 文件,以便我可以轻松地将其导入 EXCEL.

我试过:

   to make-edgelist
    file-open "Test.txt"
     ask links [file-show both-ends]
       ask turtles[file-show who]
    file-close
end

问题是'both-ends'只报告了who number,没有报告品种。我可以通过使用 ask turtles [file-show who] 来获取品种,但这会将标识附加到边缘列表的末尾,这意味着需要进行大量操作才能以正确的格式获取内容。有没有人对如何使用 breeds+who 编号构建边缘列表有任何建议?我觉得我可能遗漏了一些简单的东西,但我是 Netlogo 的新手。谢谢!

我假设您用于分析的任何程序都可以根据需要组织和重新排列您的对,因此只要记录了所有对,您的网络应该可以正常构建,而不管顺序如何。您使用 ask-linksboth-ends 的方法是一个很好的方法,并且需要进行一些调整(主要是使用 breed 原语让海龟在输出中包含它们的品种。这是一个示例:

to pairs-out

  file-open "test.csv"
  file-type (word "End_1, " "End_2,\n" )
  ask links [
    ask both-ends [
      file-type (word breed " " who ",")
    ]
    file-type "\n"
  ]
  file-close

end

csv extension 使它成为 one-liner。假设您的代码顶部有 extensions [ csv ],您可以这样做:

csv:to-file "test.csv" [ [ (word breed " " who) ] of both-ends ] of links

如果您需要列标题,可以使用 fput 添加它们,例如:

csv:to-file "test.csv"
  fput ["source" "target"]
  [ [ (word breed " " who) ] of both-ends ] of links

但是请注意,both-ends 是一个始终以随机顺序访问的代理集,因此 "source" 和 "target" 在这种情况下意义不大。

如果您有定向链接并且方向很重要,您可以使用这个稍微复杂一点的版本来保留它:

csv:to-file "test.csv"
  fput ["source" "target"]
  [ map [ t -> [ (word breed " " who) ] of t ] (list end1 end2) ] of links