我在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 ++或其他编程语言?
有什么建议吗?
提前致谢, 美好的一天
答案 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