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