Networking 根据Netlogo中的条件将代理移动到节点

Networking 根据Netlogo中的条件将代理移动到节点,networking,netlogo,agent,Networking,Netlogo,Agent,我想在Netlogo中创建一个网络,在网络的第一个节点上放置3个代理,并使它们移动到连接的节点 具体来说,我希望代理根据概率选择要移动到的节点。如果连接的节点上没有代理,则选择p=0.5;如果节点上有代理,则选择p=0.7。因此,如果(例如)起始节点有两个相邻节点,其中一个节点上有另一个代理,则应该以更高的概率选择它 我已经成功地创建了网络并随机移动了代理,但我不知道如何让代理“知道”节点上是否有其他代理,并根据此条件设置概率 breed [nodes node] breed [walkers

我想在Netlogo中创建一个网络,在网络的第一个节点上放置3个代理,并使它们移动到连接的节点

具体来说,我希望代理根据概率选择要移动到的节点。如果连接的节点上没有代理,则选择p=0.5;如果节点上有代理,则选择p=0.7。因此,如果(例如)起始节点有两个相邻节点,其中一个节点上有另一个代理,则应该以更高的概率选择它

我已经成功地创建了网络并随机移动了代理,但我不知道如何让代理“知道”节点上是否有其他代理,并根据此条件设置概率

breed [nodes node]
breed [walkers walker]

walkers-own [location ]

to setup
  clear-all
  set-default-shape nodes "circle"
  create-nodes 18 [set color white]
  ask nodes [ create-link-with one-of other nodes ]
  layout-circle nodes 10
  create-walkers 3 [
    set location node 1
    move-to location
  ]
  reset-ticks
end

to go
  ask walkers [
    let new-location one-of [link-neighbors] of location ;; choose a new location randomly
    move-to new-location
    set location new-location
  ]
  tick
end
我想创建一个
已占用?
变量,并根据代理的位置进行更新,但它将是一个
节点拥有的
变量,我无法连接到代理(
walkers


我是Netlogo的新手,不知道所有的可能性和局限性,所以我可能对这个问题的看法完全错误。非常感谢您的帮助。

锡鲁,有几点

首先,如果这两个节点之间已经存在链接,则创建链接将以静默方式失败。结果是,您的一些节点最终将只有一个邻居。如果这不好,您需要处理您的链接创建逻辑

第二,这可能不明显,但有些节点最终会有两个以上的链接, 因此,步行者可能有许多不同的路径可供选择

第三,一个节点可能有多个占用者。例如,所有其他步行者可能都在上面

考虑到所有这些,我将假设您要求的是每个步行者开始查看其链接节点,根据目标节点的占用情况设置一些概率,选择一个随机数,如果低于该概率,则移动到该节点,并停止查看其他可能的移动。但是,如果随机数高于该概率,那么步行者应该忘记该链接,继续考虑下一个链接。如果所有链接都未通过单独的测试,则助行器不会移动

下面的代码实现了这一点。它变得又长又乱。以下是主要功能

  • 我加了一个冗长的?打开或关闭打印详细信息以进行调试的开关 它会询问用户每次设置是否详细。如果你打 去一次(不是永远)你可以看到什么设置,如果它是你想要的

  • 我向每个节点添加了步行者的数量,而不是真/假占用率?开关

  • 我向每个观察者添加了一个序列号(如“who”)以生成输出 更理智地阅读

  • GO步骤将列出作为观察者节点的链接邻居的节点 他站在上面。然后它将列表按您要检查的顺序排序 他们(我使用了一个列表,因为您可能会关心它们的查看顺序,以及 代理集是随机排序的。)我按 占用计数,因此它将首先查看未占用的节点,然后查看 被占用的,直到被占用最多的

  • 然后它遍历该列表,决定是否移动到该节点。 一旦它决定移动,它就会停止查看列表,因此一些节点 甚至不会考虑搬家

  • 您可以看到根据占用情况设置概率的部分 节点的计数。我用你的0.5和0.7概率加上了0.9 目标节点上有2个或更多观察者的概率

  • 代码有很多注释,如果设置为verbose?事实上,你可以 检查每个观察者如何考虑(或不考虑)每个链接,并做出相应的决定 决定是否搬家

只要我能告诉你你想要的是什么,代码就运行起来了,看起来还不错。问我 如果不清楚我做了什么,我会提出问题

breed [nodes node]
breed [walkers walker]

walkers-own [location seqnum ]  ;; seqqnum is like who but for the walkers

nodes-own[ count-of-walkers ]    ;; ADDED

globals [verbose?]

to setup
  clear-all
  set verbose? false                     ;; if true, prints a lot for debugging purposes
  if user-yes-or-no? "Print debugging info on each step?" [set verbose? true]

  set-default-shape nodes "circle"
  create-nodes 18 [set color white]
  ask nodes [ create-link-with one-of other nodes ]
  layout-circle nodes 10
  let seq 1               ;; start of sequence numbers for walkers
  create-walkers 3 [
    set size 3
    set color red
    set location node 1
    set seqnum seq set seq seq + 1  ;; assign the sequence number
    move-to location
    ask location [ set count-of-walkers count-of-walkers + 1 ]
  ]
  reset-ticks
end

to go
  if verbose? [print "    ================================== starting the go loop"]
  ask walkers [

    let candidate-set []  ;; this will be an agent set of neighboring linked nodes

    ask location [set candidate-set link-neighbors ]  ;; ask my node to find its neighbors

    ;; sort the neighbors into some order and make a list of them
    ;; the next line sorts them into ascending order by occupancy ( lowest first )
    ;; we will consider a move to each one in that order

    let candidate-list sort-on [count-of-walkers] candidate-set  

    if verbose? [
     type "walker " type seqnum
     type " is checking out these neighbors: " print candidate-list
    ]

    ;;     Examine each neighbor and decide whether to move there based on probabilities
    ;;     if we find a place to move we like  terminate processing the list
    ;;     otherwise, remove that candidate neighbor from the list
    ;;     and keep doing that until the list is empty
    ;;  

    while [length candidate-list > 0 ]  [        ;; while we haven't decided to move yet


        ;; pop the first item off the list  
        let candidate first candidate-list            ;; pull the first item
        set candidate-list but-first candidate-list   ;; and remove it from the list

      ;; decide what probability to use for considering THIS move
       let prob-of-move 0  ;; a default value
       let occupant-count [ count-of-walkers ] of candidate ;; count walkers on that node

       if occupant-count = 0 [ set prob-of-move 0.5 ]
       if occupant-count = 1 [ set prob-of-move 0.7 ]
       if occupant-count > 1 [ set prob-of-move 0.9 ]

      if verbose? [
       type " ... candidate " type candidate
       type " has this many walkers " type [count-of-walkers] of candidate
       type " so set probability of move to " print prob-of-move
      ]

      ;; make a decision to move or not based on that probability
        if-else random-float 1 < prob-of-move [
        if verbose? [type  " ......moving to " print candidate]
        ;;let new-location candidate
        set candidate-list []  ;; make the list empty so this WHILE loop will exit
        move-to candidate      ;; move the walker on the display

        ;; update the counts of walkers on each affected node
        ask candidate [ set count-of-walkers count-of-walkers + 1 ]
        ask location  [ set count-of-walkers count-of-walkers - 1 ]

        ;; finally, tell the walker where it is now
        set location candidate

      ]
      [if verbose? [ print " ..... was not selected for a move to this node"]]

    ]

    if verbose? [ print " ..............done with processing walkers for this tick"]

    ]
  tick
end
繁殖[节点]
品种[步行者]
步行者拥有[location seqnum];;除了步行者,SeqNum就像是谁
节点拥有[步行者计数];;补充
全局[详细?]
设置
清除所有
设置冗长?错误的如果为true,则打印大量以进行调试
如果用户选择是或否?“打印每个步骤的调试信息?”[设置详细信息?为真]
将默认形状节点设置为“圆形”
创建节点18[设置白色]
询问节点[创建与其他节点之一的链接]
布局圆节点10
让我们看看下面的1;;Walker序列号的开始
创建walkers 3[
3号套餐
设置颜色为红色
设置位置节点1
set seqnum seq set seq seq+1;;分配序列号
移动到位置
询问位置[设置步行者计数步行者计数+1]
]
重置滴答声
终止
外带
如果冗长?[打印“=========================================================启动go loop”]
询问步行者[
让候选集[];;这将是相邻链接节点的代理集
询问位置[设置候选设置链接邻居];;要求我的节点查找其邻居
把邻居按一定的顺序分类,并把他们列一个清单
;下一行按占用率按升序排列(最低优先)
我们会考虑按顺序向每个人移动。
让候选列表对[count of Walker]候选集进行排序
如果冗长[
类型“walker”类型seqnum
键入“正在签出这些邻居:”打印候选列表
]
检查每个邻居,并根据概率决定是否搬到那里
如果我们找到一个地方搬家,我们会终止处理名单
;否则,从列表中删除该候选邻居
继续这样做,直到列表为空
;;  
while[length candidate list>0][;;虽然我们还没有决定搬家
从列表中弹出第一项
让候选人