我的模型中有大约5000个代理(人)。我想给他们任意数量的朋友,并有互惠但随机的配对。因此,如果人A选择人B,那么人B也选择人A.我的代码工作正常,但是相当慢。我可能想要增加朋友的数量和未来的人数。有没有更快的建议?
ask people
[ let new-links friends - count my-links
if new-links > 0
[ let candidates other people with [ count my-links < friends ]
create-links-with n-of min (list new-links count candidates) candidates
[ hide-link ]
]
]
请注意,朋友是上述代码中的全局变量,但我的最终代码可能会推广为wanted-number-of-friends
作为人的属性。
已编辑已添加if new-links > 0
条件,以便在无需找到候选项时避免使用嵌套ask
。这提高了速度,但仍然没有真正的可扩展性。
答案 0 :(得分:3)
好问题。这实际上非常具有挑战性。有问题的一行是:
let candidates other people with [ count my-links < friends ]
这很慢,因为它让每个代理都与其他代理进行核对。拥有5000名代理商,即25,000,000张支票!遗憾的是,如果没有一些奇特的数据结构,优化这一特定线路并不是一个好方法。
幸运的是,有一种解决方案可以很好地概括为在网络中生成任何度数分布(这听起来像是你最终想要的)。不幸的是,该解决方案并不能很好地转换为NetLogo。不过这是:
let pairs [] ;; pairs will hold a pairs of turtles to be linked
while [ pairs = [] ] [ ;; we might mess up creating these pairs (by making self loops), so we might need to try a couple of times
let half-pairs reduce sentence [ n-values friends [ self ] ] of turtles ;; create a big list where each turtle appears once for each friend it wants to have
set pairs (map list half-pairs shuffle half-pairs) ;; pair off the items of half-pairs with a randomized version of half-pairs, so we end up with a list like: [[ turtle 0 turtle 5 ] [ turtle 0 turtle 376 ] ... [ turtle 1 turtle 18 ]]
;; make sure that no turtle is paired with itself
if not empty? filter [ first ? = last ? ] pairs [
set pairs []
]
]
;; now that we have pairs that we know work, create the links
foreach pairs [
ask first ? [
create-link-with last ?
]
]
这里friends
是全局变量还是乌龟变量并不重要。这需要的时间取决于它需要尝试进行配对的次数,这是随机的。通过实验,我发现通常大约需要3秒钟就有5000个代理商,每个代理商都有5个程度。这与我的机器上的大约60秒进行比较,并采用原始的方式进行此操作(对于它的价值,它是使用较少代理时的推荐方式。)
答案 1 :(得分:1)
调试后(参见NetLogo Efficiently create network with arbitrary degree distribution),以下版本相对有效。它需要一个全局变量(下面称为lonely
)来存储仍然需要链接的海龟的代理集。删除单个乌龟比每次创建候选集的嵌套过程更有效。
ask turtles
[ set lonely other lonely
let new-links nFriends - count my-links
if new-links > 0
[ let chosen n-of min (list new-links count lonely) lonely
create-links-with chosen [ hide-link ]
ask chosen [ if count my-links = nFriends [ set lonely other lonely ] ]
]
]