I am trying to implement Karger's algorithm and am having trouble with lists in Python.
I have an input list input_v
that should stay static throughout the program. Inside a while loop, I do max_iters
iterations of Karger's algorithm with a list copy of input_v
called vertices
. At the end of 1 iteration of the inside for loop, it seems that all the logic I applied on vertices
was also applied on input_v
, even though I did vertices = list(input_v)
.
input_v = [[[1], 2, 3, 4], [[2], 1, 4], [[3], 1, 4], [[4], 2, 3]]
# Perform Karger's n^2ln(n) times to ensure p > 1-1/n
for i in range(0, max_iters):
vertices = list(input_v)
print 'new loop'
print vertices
print input_v
#Contract edges n-2 times to find A and B
for j in range(0, n - 2):
# length of current array
len_arr = n - j
#rand_vn => random index within current array
#i_vn => true index of vertex from orig array
# Randomly select 1st vertex (v1) to contract
rand_v1 = randint(1, len_arr) - 1
i_v1 = vertices[rand_v1][0][0]
# Randomly select 2nd vertex (v2) connected to v1
i_in_v1 = randint(1,len(vertices[rand_v1]) - 1)
i_v2 = vertices[rand_v1][i_in_v1]
for k in range(0, len_arr):
if i_v2 in vertices[k][0]:
rand_v2 = k
for y in vertices[rand_v2][1:]:
if y not in vertices[rand_v1]:
vertices[rand_v1].append(y);
# Remove each other's indices from list of edges
for q in vertices[rand_v2][0]:
if q in vertices[rand_v1]:
vertices[rand_v1].remove(q)
# Add indices from v2 to v1 (supernode)
vertices[rand_v1][0].append(q)
for r in vertices[rand_v1][0]:
if r in vertices[rand_v1]:
vertices[rand_v1].remove(r)
vertices.pop(rand_v2)
print vertices
del vertices[:]
And here's the output after shortly beginning the 2nd iteration.
new loop
[[[1], 2, 3, 4], [[2], 1, 4], [[3], 1, 4], [[4], 2, 3]] # input_v
[[[1], 2, 3, 4], [[2], 1, 4], [[3], 1, 4], [[4], 2, 3]] # vertices
[[[1, 3], 2, 4], [[2], 1, 4], [[4], 2, 3]]
[[[1, 3, 2], 4], [[4], 2, 3]] # vertices at the end of Karger's
new loop
[[[1, 3, 2], 4], [[2], 1, 4], [[3], 1, 4], [[4], 2, 3]] # input_v (seems to be a hybrid)
[[[1, 3, 2], 4], [[2], 1, 4], [[3], 1, 4], [[4], 2, 3]] # vertices
[[[1, 3, 2], 4], [[2], 1, 4], [[3, 4], 1, 2]]
[[[1, 3, 2, 3, 4]], [[2], 1, 4]] # Garbage because of unexpected behaviour