-
Notifications
You must be signed in to change notification settings - Fork 0
/
SPARTA_CP.py
125 lines (102 loc) · 3.13 KB
/
SPARTA_CP.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
from random import *
from math import *
import numpy as np
from CONSTANT import *
from SPARTA import *
from IO import *
seed(CONSTANT.random_seed)
class Vertex(object):
def __init__(self, t):
self.t = t
self.neigh = []
class Cluster(object):
def __init__(self, v1, v2):
if type(v1) == Vertex:
if type(v2) == Vertex:
self.v = [v1, v2]
if type(v2) == Cluster:
self.v = [v1] + v2.v
if type(v1) == Cluster:
if type(v2) == Vertex:
self.v = v1.v + [v2]
if type(v2) == Cluster:
self.v = v1.v + v2.v
self.neigh = []
def Method2(T, Rs):
S = []
n = len(T)
V = [Vertex(T[i]) for i in range(n)]
E = []
for i in range(n - 1):
for j in range(i + 1, n):
if dist(V[i].t.v, V[j].t.v) <= 2 * Rs:
V[i].neigh.append(V[j])
V[j].neigh.append(V[i])
E.append([V[i], V[j]])
while True:
count0 = 0
for Ver in V:
if len(Ver.neigh) == 0:
count0 += 1
if count0 == len(V):
break
V.sort(key=lambda x: len(x.neigh))
index = 0
while True:
if len(V[index].neigh) > 0:
N1 = V[index]
break
else:
index += 1
N1.neigh.sort(key=lambda x: len(x.neigh))
N2 = N1.neigh[0]
mindeg = len(N1.neigh[0].neigh)
for i in range(1, len(N1.neigh)):
if len(N1.neigh[i].neigh) == mindeg:
temp1 = [N1.neigh[i].neigh[j] for j in range(mindeg) if N1.neigh[i].neigh[j] != N1]
temp2 = [N1.neigh[j] for j in range(len(N1.neigh)) if N1.neigh[j] != N1.neigh[i]]
if temp1 == temp2:
N2 = N1.neigh[i]
else:
break
N = Cluster(N1, N2)
for Ver in V:
if Ver != N1 and Ver != N2:
if N1 in Ver.neigh and N2 in Ver.neigh:
Ver.neigh.remove(N1)
Ver.neigh.remove(N2)
Ver.neigh.append(N)
N.neigh.append(Ver)
else:
try:
Ver.neigh.remove(N1)
except:
pass
try:
Ver.neigh.remove(N2)
except:
pass
V.remove(N1)
V.remove(N2)
V.append(N)
C = []
for i in range(len(V)):
C.append([])
if type(V[i]) == Cluster:
for j in range(len(V[i].v)):
C[i].append(V[i].v[j].t)
else:
C[i].append(V[i].t)
return C
def SPARTA_CP(T, Rs):
C = Method2(T, Rs)
S = []
Tc = []
for i in range(len(C)):
Tc.append([])
for j in range(len(C[i])):
Tc[i].append(C[i][j])
for i in range(len(C)):
Sq = SPARTA(Tc[i], Rs)
S += Sq
return S