2017-11-10 9 views
2

Nノードと<k>を平均次数とするランダムネットワーク(およびスケールフリー)を作成したいと考えています。どうやってやるの?ノード数と平均次数を持つネットワークを作成する

nw: generate-random(及びnw:generate-preferential-attachment)NetLogoのNW拡張の方法は、ノードの平均次数を処理できるようには思えません。

私は間違っていますか?ヒント?おかげさまで

答えて

2

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

ありがとうございます。コードは完全に機能します(私は0ノードのネットワークから始めるので、コードを変更する必要はありません)。 1つの質問:[2 *カウントは beth

+2

基本的には、十分な数のリンクがあるかどうかをチェックします(正確にターゲットの次数の半分にカメの数を掛けたものが必要です)。そうでない場合、コードはチャンク([]内)創造された。 – JenB

+0

JenBはまさに正しいです。私はなぜそれがそれぞれの手順で重要であると言う私の答えを拡大しました。 –

関連する問題