Netlogo 表示其他海龟记忆的海龟变量

Netlogo 表示其他海龟记忆的海龟变量,netlogo,Netlogo,我有一个模型,其中海龟以离散增量(使用移动到过程)浏览节点图(也存储为海龟)和链接。我想创建一个基于turtle的变量,它允许turtle记住他们访问图中特定节点的次数 e、 g 海龟移动到节点 在所需结构中查找该节点的存在 如果存在设置与该节点关联的#访问#访问+1 如果未将其包括在结构中,则set#访问1 我想我的选项与列表或表格相关,但我不确定哪一个是最有效的。关于表,我认为关键不可能是海龟——也许是从who派生的字符串——但这感觉可能效率低下 可能相关的两点: 有些图将有大量的节点(~

我有一个模型,其中海龟以离散增量(使用
移动到
过程)浏览节点图(也存储为海龟)和链接。我想创建一个基于turtle的变量,它允许turtle记住他们访问图中特定节点的次数

e、 g

  • 海龟
    移动到节点
  • 在所需结构中查找该节点的存在
  • 如果存在
    设置与该节点关联的#访问#访问+1
  • 如果未将其包括在结构中,则
    set#访问1
  • 我想我的选项与列表或表格相关,但我不确定哪一个是最有效的。关于表,我认为关键不可能是海龟——也许是从who派生的字符串——但这感觉可能效率低下

    可能相关的两点:

    • 有些图将有大量的节点(~5000个),而有些海龟通常不会访问所有的节点,因此动态增长结构以节省内存可能是明智的

    • 也可能有数量相对较多的代理(~2500)


    如以往一样,任何建议都将不胜感激

    表是一种更有效的方式,而且在代码方面也更简单,尽管使用代理作为键不起作用(这让我很惊讶)。也就是说,您可以使用
    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
    数字作为索引或其他什么)方面效率很高,但不能同时使用这两种方法,除非您基本上使用列表编写自己的哈希表实现

    现在,抛开所有这些不谈,您通常应该担心以下性能问题,直到您:

  • 现在有性能问题吗
  • 知道这些是性能问题的根源(通过使用计时器或
    分析器
    扩展进行评测)

  • 我建议使用表扩展的真正原因是因为它是最简单的实现方式。

    我意识到我迟到了,Bryan的回答很好,但另一种解决方案是使用单独的链接来记录对节点的访问次数:

    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
    
    繁殖[节点]
    无向链接繁殖[边缘];节点
    繁殖[代理人]
    定向链接[访问];代理-->节点
    自己的访问量[num访问量]
    设置
    清除所有
    创建节点10[使用n个(1+随机2个)其他节点创建边]
    创建代理10[移动到其中一个节点]
    结束
    外带
    询问代理人[
    让目标节点成为其中一个节点的[边缘邻居]之一
    移动到目的地
    如果外出访问目的地=无人[创建访问目的地]
    邀请访问目的地[设置访问次数num visions num visions+1]
    ]
    结束
    

    它可能没有使用表扩展的速度快,但它的优点是允许从两侧进行查询:您可以询问代理访问了哪些节点多少次,但您也可以询问节点被哪些代理访问了多少次。

    感谢这一点,Bryan-看起来正是我要找的。但是,在实现时,我会收到以下错误消息:
    扩展异常:(子节点149)不是有效的表键(表键只能是数字、字符串、true或false,或者项目为有效键的列表)
    我使用
    设置节点访问表:make
    实例化了表。我也在运行5.2.1而不是5.3.1,如果这有什么不同的话。我为代理打开了一个问题作为密钥: