def generate_constrs(self, model: Model): G = nx.DiGraph() r = [(v, v.x) for v in model.vars if v.name.startswith('x(')] U = [v.name.split('(')[1].split(',')[0] for v, f in r] V = [v.name.split(')')[0].split(',')[1] for v, f in r] N = list(set(U + V)) cp = CutPool() for i in range(len(U)): G.add_edge(U[i], V[i], capacity=r[i][1]) for (u, v) in product(N, N): if u == v: continue val, (S, NS) = nx.minimum_cut(G, u, v) if val <= 0.99: arcsInS = [(v, f) for i, (v, f) in enumerate(r) if U[i] in S and V[i] in S] if sum(f for v, f in arcsInS) >= (len(S) - 1) + 1e-4: cut = xsum(1.0 * v for v, fm in arcsInS) <= len(S) - 1 cp.add(cut) if len(cp.cuts) > 256: for cut in cp.cuts: model.add_cut(cut) return for cut in cp.cuts: model.add_cut(cut) return
def generate_cuts(self, model: Model): G = nx.DiGraph() r = [(v, v.x) for v in model.vars if v.name.startswith('x(')] U = [int(v.name.split('(')[1].split(',')[0]) for v, f in r] V = [int(v.name.split(')')[0].split(',')[1]) for v, f in r] for v in model.vars: print('{} = {} '.format(v.name, v.x), end='') print() input() cp = CutPool() for i in range(len(U)): G.add_edge(U[i], V[i], capacity=r[i][1]) for (u, v) in F: if u not in U or v not in V: continue val, (S, NS) = nx.minimum_cut(G, u, v) if val <= 0.99: arcsInS = [(v, f) for i, (v, f) in enumerate(r) if U[i] in S and V[i] in S] if sum(f for v, f in arcsInS) >= (len(S) - 1) + 1e-4: cut = xsum(1.0 * v for v, fm in arcsInS) <= len(S) - 1 cp.add(cut) if len(cp.cuts) > 256: for cut in cp.cuts: model.add_cut(cut) return for cut in cp.cuts: model.add_cut(cut) return
def generate_cuts(self, model: Model): def row(vname: str) -> str: return int(vname.split('(')[1].split(',')[0].split(')')[0]) def col(vname: str) -> str: return int(vname.split('(')[1].split(',')[1].split(')')[0]) x = {(row(v.name), col(v.name)): v for v in model.vars} for p, k in enumerate(range(2 - n, n - 2 + 1)): cut = xsum(x[i, j] for i in range(n) for j in range(n) if i - j == k) <= 1 if cut.violation > 0.001: model.add_cut(cut) for p, k in enumerate(range(3, n + n)): cut = xsum(x[i, j] for i in range(n) for j in range(n) if i + j == k) <= 1 if cut.violation > 0.001: model.add_cut(cut)