龟变量代表其他乌龟的记忆

时间:2016-05-22 13:07:07

标签: netlogo

我有一个模型,其中海龟导航节点图(也存储为海龟)和离散增量链接(使用move-to程序)。我想创建一个基于海龟的变量,它允许海龟记住他们访问图中特定节点的次数。

e.g。

  1. turtle move-to一个节点
  2. 在所需结构中查找该节点的存在
  3. 如果它与该节点相关联set #visits #visits + 1
  4. 如果不在结构和set #visits 1
  5. 中包含它

    我想我的选项与列表或表格有关 - 但我不确定哪些选项最有效。关于表格,我不认为密钥可能是一只乌龟 - 也许是一个源于它的字符串 - 但这感觉它可能效率低下。

    可能相关的两点:

    • 一些图表将有大量节点(~5000),并且通常一些海龟将永远不会访问所有这些节点,因此将结构快速增长到可能是合理的节省内存。

    • 也可能有相对大量的代理(~2500)

    任何建议,一如既往,非常感谢。

2 个答案:

答案 0 :(得分:3)

表格是更有效的方式,而且代码更容易,但使用代理作为键不起作用(令我惊讶)。也就是说,您可以使用who个数字作为键。

看起来像是:

extensions [ table ]
turtles-own [ node-visits ] 

...

to move-to-node [ node ]
  move-to node
  let key [ who ] of node
  let visits ifelse-value (table:has-key? node-visits key) [ table:get node-visits key ] [ 0 ]
  table:put node-visits key (visits + 1)
end

表在内存使用和查找速度方面都很有效。您可以使用列表执行此操作并在内存使用方面有效(如果使用键值对)查找速度(如果使用who数字作为索引或某些内容)但不能同时使用两者,除非你基本上用列表编写自己的哈希表实现。

现在,除此之外,你通常应该担心这些性能问题,直到你:

  1. 现在遇到性能问题
  2. 知道这些事情是您性能问题的根源(通过使用计时器或profiler扩展程序进行分析)
  3. 我建议表扩展的真正原因是因为它是最简单的实现。

答案 1 :(得分:1)

我意识到我迟到了,而且布莱恩的答案非常好,但另一种解决方案是使用单独的链接来记​​录对节点的访问次数:

breed [ nodes node ]
undirected-link-breed [ edges edge ] ;  node <---> node
breed [ agents an-agent ]
directed-link-breed [ visits visit ] ; agent ----> node
visits-own [ num-visits ]

to setup
  clear-all  
  create-nodes 10 [ create-edges-with n-of (1 + random 2) other nodes ]
  create-agents 10 [ move-to one-of nodes ]
end

to go
  ask agents [
    let destination one-of [ edge-neighbors ] of one-of nodes-here
    move-to destination
    if out-visit-to destination = nobody [ create-visit-to destination ]
    ask out-visit-to destination [ set num-visits num-visits + 1 ]
  ]
end

它可能没有使用表扩展那么快,但它的优势在于允许来自双方的查询:您询问代理访问了多少次节点,但您也可以询问节点有多少次时间被哪些代理人访问过。