2016-07-05 11 views
-2

NetLogoモデルのパッチ環境(色付き領域)でクラスタのサイズ(パッチ数)のリストを取得するのに時間的な問題があります。 50×50、100×100、または150×150の標準DFSのBFSの小さなグリッド値(NetLogoの世界サイズ)が効率的になりますが、注文が増えるにつれてこれらの手順は実行不可能になります。私の仕事は、同じ結果を計算することですが、少なくとも10000 x 10000パッチ以上のグリッドを対象としています。大きな正方形のグリッドでクラスターを測定する良い方法は何ですか?

私はHoshen-Kopelmanアルゴリズムで連合は、検索しようとしたが、私の実際のNetLogo実装がオーダーのpatcheグリッドの約5時間500×500

を費やしているいずれかの世界のためにあらゆる計算するアルゴリズムまたはラベリングクラスターを知っています少なくとも1000 x 1000個のパッチが必要ですか?

パッチとNetlogoを使用する代わりに、私はC/C++や他のプログラミング言語に切り替えることができますか?

提案がありますか?事前に

おかげで、私のコードは基本的にこのモデルClusters with Recursionある

+0

は、我々はあなたのNetLogoコードを見ることができますか?私はあなたがどんなアルゴリズムを必要としているとは思わない、あなたはNetLogoプリミティブでこれを行うことができるはずですが、私はあなたがこの質問のクラスターによって何を意味しているかは不明です。 – JenB

+0

あなたのコメントのために@JenBありがとう、私は最後の試みが[リンク](http://modelingcommons.org/browse/one_model/2328#model_tabs_browse_info)でモデルからモデルを作成することでした(これはまさに私です2つの色と大きなpatcheの世界の必要性)、それは基本的にその4近傍で再帰と幅広い検索を使用します。不幸にも、モデルが大きなクラスターを検出する必要があるので、巨大な世界(少なくとも1000000個のパッチ)で複雑な問題が残っています。再帰プロシージャーは、あなたの情報のおかげで再帰が深すぎると通知します。よろしく –

答えて

0

偉大な日。

クラスターが適度なサイズを持つ場合、モデルはクラスターを非常によく見いだしますが、セットアップ手順で大きなクラスターが生成された場合、再帰で「再帰が深すぎます」と表示されず、結果が報告されません。 netlogoでこの "再帰的な深さ"を避けますか?

Netlogoコード:

globals [npixel caux final-participante1 final-participante2 r i j intera2 clist1 clist2 nc1 nc2] 
patches-own 
[ 
    partido influencia votoduro 
    cluster 
] 

to find-clusters 
    loop [ 
    let seed one-of patches with [cluster = nobody] 
    if seed = nobody 
    [ contarclusvar 
     stop ] 
    ask seed 
    [ set cluster self 
     grow-cluster ] 
    ] 
    display 
end 

to setup1 
    __clear-all-and-reset-ticks 
ask patches [set partido 0 set influencia 0 set cluster nobody] 
set npixel[] 
set final-participante1 0 
set final-participante2 0 

set r (L + 1) 
set-patch-size ps 
resize-world 0 L 0 L 

set participante2 (L + 1) * (L + 1) - participante1 

set i 0 
set j 0 

    repeat r 
    [ 
    repeat r 
    [ 
    set npixel sentence npixel patch i j 

    set j j + 1 
    ] 
    set i i + 1 
    set j 0 
    ] 
set Caux npixel 

let N r * r 

repeat participante1 
[ 
    let z random N 
    ask item z npixel [set pcolor white set partido 1 set influencia 1 set votoduro 1] 
    set npixel replace-item z npixel item (N - 1) npixel 
    set N N - 1 
] 

repeat participante2 
[ 
    let z random N 
    ask item z npixel [set pcolor gray set partido 2 set influencia 1 set votoduro 1] 
    set npixel replace-item z npixel item (N - 1) npixel 
    set N N - 1 
] 

;------------------- Procedure 
set clist1 [] 
set clist2 [] 

let ciclos 0 
let intera 0 
let aux 0 
let nulo 0 

if participante1 + participante2 > r * r 
    [stop] 
let C1 participante1 
let C2 participante2 

repeat 75 
[ 
    set i 0 
    set j 0 
    set npixel Caux 

    set N r * r 
    set intera 0 
    set aux 0 
    let aux2 (((ciclos - 1) * r * r) + intera2)    

    repeat (r * r) 
[ 
    let z random N 
    ask item z npixel 
    [ 
     let sum-inf1 sum ([influencia] of neighbors4 with [partido = 1]) 
     let sum-inf2 sum ([influencia] of neighbors4 with [partido = 2]) 


    if (sum-inf2 = sum-inf1) and (partido = 1) [ask item z npixel [set pcolor black set partido 0 set influencia 0 ] set Nulo Nulo + 1 set C1 C1 - 1 set aux aux + 1 set intera2 intera] 
    if (sum-inf2 = sum-inf1) and (partido = 2) [ask item z npixel [set pcolor black set partido 0 set influencia 0 ] set Nulo Nulo + 1 set C2 C2 - 1 set aux aux + 1 set intera2 intera] 

    if ((sum-inf1 > sum-inf2) and ((partido = 2) or (partido = 0))) [ 
     set pcolor white set partido 1 set influencia 1 
     set C1 C1 + 1 set C2 C2 - 1 set aux aux + 1 set intera2 intera 
     ] 

if ((sum-inf2 > sum-inf1) and ((partido = 1) or (partido = 0))) [ 
     set pcolor gray set partido 2 set influencia 1 
     set C2 C2 + 1 set C1 C1 - 1 set aux aux + 1 set intera2 intera 
    ] 

    set npixel replace-item z npixel item (N - 1) npixel 
    set N N - 1 
    set intera intera + 1 
    ] 

    if (intera - aux) > (r * r) - 1 [ 
    stop 
    ] 
] 
] 
end 

to contarclusvar 
let comp [] 

     set comp ([cluster] of patches with [pcolor = white]) 
     set comp remove-duplicates comp 
     set nc1 length comp 

    foreach comp [ set clist1 sentence clist1 count patches with [cluster = ? and pcolor = white] 
     ] 
    set comp [] 

     set comp ([cluster] of patches with [pcolor = gray]) 
     set comp remove-duplicates comp 
     set nc2 length comp 

foreach comp [ set clist2 sentence clist2 count patches with [cluster = ? and pcolor = gray] 
     ] 
end 

to grow-cluster 
    ask neighbors4 with [(cluster = nobody) and (pcolor = [pcolor] of myself)] 
    [ set cluster [cluster] of myself 
    grow-cluster ] 
end 

to show-clusters 
    let counter 0 
    loop [ 
    let p one-of patches with [plabel = ""] 
    if p = nobody 
     [ stop ] 
    ask p 
    [ ask patches with [cluster = [cluster] of myself] 
     [ set plabel counter ] ] 
    set counter counter + 1 
    ] 
end 
関連する問題