我需要在代理与链接连接时进行网络,并且我希望它能够使每个代理都有确切数量(变量)的链接。让我们说,例如,我想要从每个代理到另一个代理的3个链接。不多也不少。我试图使用这段代码:
let num-links (links * number) / 2
while [count links < num-links ]
[
ask one-of turtles
[
let choice (min-one-of (other turtles with [not link-neighbor? myself])
[distance myself])
if choice != nobody [ create-link-with choice ]
]
]
其中“number”是节点数,“links”是我想从每个代理发送的链接数量 - 但不幸的是,这段代码的工作原理是“链接”实际上只是一个平均的节点级别。因此,如果我想要3个链接,我可以获得所有代理(例如两个除外),其中3个链接从它们开始,但其中一个只有1个链接而另外5个(平均值为3)。有什么方法怎么做。
有没有办法如何做到这一点,以便每个“链接”实际上是两个有向链接,一个从节点进入,一个进入节点?
最后一个问题。我想给这个链接一个变量,但我需要这样做,以便每个代理的这些变量的总和正好是100(作为百分比)。
有任何帮助吗?非常感谢你。
答案 0 :(得分:2)
以下是我为小型网络(易于理解)创建固定学位网络的方法
to make-legal
create-turtles 100 [setxy random-xcor random-ycor]
let target-degree 5
while [ min [ count my-links ] of turtles < target-degree ]
[ ask links [die]
makeNW-Lattice target-degree
]
end
to makeNW-Lattice [DD]
ask turtles
[ let needed DD - count my-links
if needed > 0
[ let candidates other turtles with [ count my-links < DD ]
create-links-with n-of min (list needed count candidates) candidates
]
]
end
有关更大网络的更有效方法,请参阅NetLogo Efficient way to create fixed number of links。
请针对单独的问题提出单独的问题
更新以确保所有节点都具有所需的学位,以回应评论
基于以下代码,基本生成器在{50}的时间内完成了legal
网络。因此,我只是将原始代码放入while循环中,如果不合法,则重新生成。对于大型网络来说,这不是一个好的解决方案,但这是一个合理的黑客攻击。
to setup
let mins (list 0 0 0 0 0 0)
repeat 100
[ ask turtles [die]
ask links [die]
makeNW-lattice
let this-min min [ count my-links ] of turtles
set mins replace-item this-min mins (item this-min mins + 1)
]
print mins
end