N
ノードと<k>
を平均次数とするランダムネットワーク(およびスケールフリー)を作成したいと考えています。どうやってやるの?ノード数と平均次数を持つネットワークを作成する
nw: generate-random
(及びnw:generate-preferential-attachment
)NetLogoのNW拡張の方法は、ノードの平均次数を処理できるようには思えません。
私は間違っていますか?ヒント?おかげさまで
N
ノードと<k>
を平均次数とするランダムネットワーク(およびスケールフリー)を作成したいと考えています。どうやってやるの?ノード数と平均次数を持つネットワークを作成する
nw: generate-random
(及びnw:generate-preferential-attachment
)NetLogoのNW拡張の方法は、ノードの平均次数を処理できるようには思えません。
私は間違っていますか?ヒント?おかげさまで
nw:generate-random
でもnw:generate-preferential-attachment
でも正確な平均次数を指定できないことは事実です。しかし、nw:generate-random
の場合、平均度は約connection-probability * num-nodes
となります。そのコードが意図的にcreate-link-with one-of other turtles with [ not link-neighbor? myself ]
ような何かを行うないを行うこと
to generate-random [ num-nodes avg-degree ]
crt num-nodes
while [ 2 * count links < avg-degree * count turtles ] [
ask one-of turtles [
create-link-with one-of other turtles
]
]
end
注:たとえば:あなたは、正確な平均次数を指定したいならば、あなたは次のように使用することができ、言っ
observer> repeat 10 [ ca nw:generate-random turtles links 1000 0.1 print 2 * count links/count turtles ]
99.902
100.358
100.522
99.674
100.338
100.272
99.772
100.24
100.24
100.412
(つまり平均的な度合は正しいかもしれませんが、度数分布は歪んでしまいます)。
優先インストールはもう少し複雑です。私たちは、入ってくるカメはに接続するのに十分なカメを持って十分なカメでシードする必要があります。
to generate-preferential-attachment [ num-nodes avg-degree ]
crt avg-degree + 1 [
create-links-with other turtles
]
repeat (num-nodes - (avg-degree + 1)) [
crt 1 [
while [ 2 * count links < avg-degree * count turtles ] [
create-link-with one-of other [ both-ends ] of one-of links
]
]
]
end
このコードは、モデルライブラリ内の優先添付モデルとして優先的に結合するための同じメカニズムを使用しています。そのモードから:
;; This code is the heart of the "preferential attachment" mechanism, and acts like
;; a lottery where each node gets a ticket for every connection it already has.
;; While the basic idea is the same as in the Lottery Example (in the Code Examples
;; section of the Models Library), things are made simpler here by the fact that we
;; can just use the links as if they were the "tickets": we first pick a random link,
;; and than we pick one of the two ends of that link.
ほとんどの場合、私はちょうど私のモデルで生成のためのNWの手順を使用しますが、私は本当に正確な平均程度を制御する必要があるとき、私は上記にバリアントを使用します。ここでも、程度分布の偏りを防ぐために予想されるよりも少し複雑です。
どちらの手順も既存のカメが存在しないと仮定しています。それがあなたのモデルに当てはまらないなら、私に教えてください。私は修正します。そうでなければ、不必要にコードを複雑にします(作成したカメを追跡する必要があるため)。
編集はコメントで質問に対する回答である:平均度がavg-degree
に等しくなるまで
while [ 2 * count links < avg-degree * count turtles ] [ ... ]
は...
が何度も実行するようになります。平均度は2 * count links/count turtles
に等しいことを想起してください。
ランダムネットワークを生成する場合は、リンクを追加し、十分なものがあるかどうかを確認し、そうでない場合は、実行するまで続けます。ルックの本体が実際にリンクを作成しない可能性があるため(の代わりにrepeat
を使用する理由)(タートルが既にカメとリンクしようとすると、リンクされています)。これは度数分布の偏りを防ぐためにこのように書かれています。タートルのリンクが増えるほど、新しいインクを獲得する可能性は低くなります。
優先接続の場合は、一度に1つのノードを追加してから、平均次数が正しいまでそのノードにリンクを追加します。これは亀頭に奇数度がより良く再生されるので、常に亀にavg-degree/2
リンクが付いてくるようにするのが望ましいです。
ありがとうございます。コードは完全に機能します(私は0ノードのネットワークから始めるので、コードを変更する必要はありません)。 1つの質問:[2 *カウントは
beth
基本的には、十分な数のリンクがあるかどうかをチェックします(正確にターゲットの次数の半分にカメの数を掛けたものが必要です)。そうでない場合、コードはチャンク([]内)創造された。 – JenB
JenBはまさに正しいです。私はなぜそれがそれぞれの手順で重要であると言う私の答えを拡大しました。 –