better dual
parent
85f3cfe02a
commit
48a7d245f0
|
@ -125,7 +125,7 @@ class LinearDualTSP(object):
|
|||
ll[i] = -1
|
||||
self.primal_ineqs.append(ll)
|
||||
|
||||
def solve(self):
|
||||
def solve_old(self):
|
||||
x, fun = self.solve_primal()
|
||||
while True:
|
||||
while True:
|
||||
|
@ -170,3 +170,46 @@ class LinearDualTSP(object):
|
|||
|
||||
return x, fun
|
||||
|
||||
def solve(self):
|
||||
n = 0
|
||||
while n < 10:
|
||||
while True:
|
||||
eqs, cts, beta, dual_fun = self.solve_dual()
|
||||
print(dual_fun)
|
||||
#print(eqs, cts, beta)
|
||||
l = []
|
||||
for i in range(self.n):
|
||||
for j in range(i):
|
||||
if (i, j) in self.edge_mapping: continue
|
||||
s = eqs[i] + eqs[j]
|
||||
for r in range(len(self.cuts)):
|
||||
if (i in self.cuts[r][0]) != (j in self.cuts[r][0]):
|
||||
s += cts[r]
|
||||
if s > self.G[i][j]['weight']:
|
||||
l.append((i, j))
|
||||
print(len(l), len(self.primal_obj))
|
||||
if len(l) == 0:
|
||||
break
|
||||
for e in l:
|
||||
self.add_edge(e)
|
||||
|
||||
x, fun = self.solve_primal()
|
||||
sG = subG(self.G, x, self.edge_mapping)
|
||||
ccs = connected_components(sG)
|
||||
print(ccs)
|
||||
if len(ccs) > 1:
|
||||
if len(ccs) == 2:
|
||||
self.add_cut((ccs[0], ccs[1]))
|
||||
else:
|
||||
for i in range(len(ccs)):
|
||||
self.add_cut((ccs[i], sum([ccs[j] for j in range(len(ccs)) if i != j], [])))
|
||||
else:
|
||||
cutV, cut = stoer_wagner_nx(sG)
|
||||
print(cutV, cut)
|
||||
if(cutV >= 2):
|
||||
break
|
||||
self.add_cut(cut)
|
||||
n += 1
|
||||
|
||||
return x, fun
|
||||
|
||||
|
|
20
testSep.py
20
testSep.py
|
@ -1,17 +1,17 @@
|
|||
from parser import parse_file
|
||||
from separation import separation
|
||||
from separation_dual import LinearDualTSP
|
||||
|
||||
from time import time
|
||||
#name = "burma14.tsp" #3001
|
||||
#name = "gr17.tsp" #1684
|
||||
#name = "gr21.tsp" #2707
|
||||
#name = "eil51.tsp" #416.5, 7s
|
||||
name = "eil51.tsp" #416.5, 7s
|
||||
#name = "gr24.tsp" #1224.5
|
||||
#name = "st70.tsp" #623.5, 31s
|
||||
#name = "gr48.tsp" #4769
|
||||
#name = "pr76.tsp" #98994.5
|
||||
#name = "dantzig42.tsp"
|
||||
name = "brazil58.tsp"
|
||||
#name = "brazil58.tsp"
|
||||
#name = "bayg29.tsp"
|
||||
#name = "bays29.tsp"
|
||||
#name = "berlin52.tsp"
|
||||
|
@ -19,10 +19,18 @@ name = "brazil58.tsp"
|
|||
|
||||
with open("TSPLIB/" + name, "r") as f:
|
||||
Adj = parse_file(f)
|
||||
#x, ival = separation(Adj)
|
||||
x, ival = LinearDualTSP(Adj).solve()
|
||||
t0 = time()
|
||||
x, ival = separation(Adj)
|
||||
#x, ival = 0,0
|
||||
t1 = time() - t0
|
||||
print(ival, t1)
|
||||
t0 = time()
|
||||
x2, ival2 = LinearDualTSP(Adj).solve()
|
||||
t2 = time() - t0
|
||||
print("Primal:", ival, "time", t1)
|
||||
print("Dual:", ival2, "time", t2)
|
||||
#print(x)
|
||||
print(ival)
|
||||
#print(ival)
|
||||
#print(list(x))
|
||||
|
||||
#for l in Adj:
|
||||
|
|
Loading…
Reference in New Issue