better dual

master
Ekdohibs 2016-12-28 12:36:11 +01:00
parent 85f3cfe02a
commit 48a7d245f0
2 changed files with 58 additions and 7 deletions

View File

@ -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

View File

@ -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: