在大方格网格中测量聚类有哪些好的替代方案?

时间:2016-07-05 19:40:58

标签: c++ c algorithm data-structures netlogo

我在NetLogo模型中获取补丁环境(彩色区域)中的群集大小(补丁数)列表时遇到问题。对于小网格值(NetLogo中的世界大小),50 x 50,100 x 100甚至150 x 150 BFS标准DFS变得高效,但随着订单增加,这些程序变得不可行。我的任务是计算相同的结果,但对于具有至少10000 x 10000补丁或更高补丁的网格。

我尝试使用Hoshen-Kopelman算法进行Union-Find,但我的实际NetLogo实现花费了大约5小时的时间用于500 x 500的patche网格。

对于至少1000 x 1000个补丁的世界,是否有人知道计算或标记集群的算法?

我可以获得一些改进吗?如果不是使用补丁和Netlogo,我会切换到C / C ++或其他编程语言?

有什么建议吗?

提前致谢, 美好的一天

1 个答案:

答案 0 :(得分:0)

My code is basically this model Clusters with Recursion.

The model finds the clusters very well when clusters has a moderate size, but if your setup procedure generates large clusters then recursion says "recursion too deep" and don not report results, now my initial question could be rephrased, how to avoid this "recursio too deep" with netlogo ?

Netlogo code:

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
相关问题