def generate_constrs(self, model: Model): xf, V_, cp, G = model.translate( self.x), self.V, CutPool(), nx.DiGraph() for i in xf: for j in i: print(j, ' ', end='') print() print('V', V_) print('F', self.F) for (u, v) in [(k, l) for (k, l) in product(V_, V_) if k != l and xf[k][l]]: G.add_edge(u, v, capacity=xf[u][v].x) print(list(G.nodes(data=True))) print(list(G.edges)) for (u, v) in F: val, (S, NS) = nx.minimum_cut(G, u, v) if val <= 0.99: aInS = [(xf[i][j], xf[i][j].x) for (i, j) in product(V_, V_) if i != j and xf[i][j] and i in S and j in S] if sum(f for v, f in aInS) >= (len(S) - 1) + 1e-4: cut = xsum(1.0 * v for v, fm in aInS) <= len(S) - 1 cp.add(cut) if len(cp.cuts) > 256: for cut in cp.cuts: model += cut return for cut in cp.cuts: model += cut
def generate_constrs(self, model: Model): xf, V_, cp, G = model.translate( self.x), self.V, CutPool(), nx.DiGraph() # valid edges for (u, v) in self.graph.edges(): try: edge = xf[u][v] G.add_edge(u, v, capacity=xf[u][v].x) except: pass for (u, v) in self.F: try: val, (S, NS) = nx.minimum_cut(G, u, v) if val <= 0.99: aInS = [(xf[i][j], xf[i][j].x) for (i, j) in product(V_, V_) if i != j and xf[i][j] and i in S and j in S] if sum(f for v, f in aInS) >= (len(S) - 1) + 1e-4: cut = xsum(1.0 * v for v, fm in aInS) <= len(S) - 1 cp.add(cut) if len(cp.cuts) > 256: for cut in cp.cuts: model += cut return except nx.NetworkXError: pass for cut in cp.cuts: model += cut
def generate_constrs(self, model: Model): x_, N, cp = model.translate(self._x), range(len(self._x)), CutPool() outa = [[j for j in N if x_[i][j].x >= 0.99] for i in N] for node in N: S = set(subtour(N, outa, node)) if S: AS = [(i, j) for (i, j) in product(S, S) if i != j] cut = xsum(x_[i][j] for (i, j) in AS) <= len(S) - 1 cp.add(cut) for cut in cp.cuts: model += cut
def generate_constrs(self, model: Model): xf, V_, cp = model.translate(self.x), self.V, CutPool() for (u, v) in [(k, l) for (k, l) in product(V_, V_) if k != l and xf[k][l]]: G.add_edge(u, v, capacity=xf[u][v].x) for (u, v) in F: val, (S, NS) = nx.minimum_cut(G, u, v) if val <= 0.99: aInS = [(xf[i][j], xf[i][j].x) for (i, j) in product(V_, V_) if i != j and xf[i][j] and i in S and j in S] if sum(f for v, f in aInS) >= (len(S)-1)+1e-4: cut = xsum(1.0*v for v, fm in aInS) <= len(S)-1 cp.add(cut) if len(cp.cuts) > 256: for cut in cp.cuts: model += cut return for cut in cp.cuts: model += cut
def generate_constrs(self, m_: Model): xf, cp, Gl = m_.translate(self.x), CutPool(), nx.DiGraph() Ar = [(i, j) for (i, j) in Arcs if xf[i][j] and xf[i][j].x >= 1e-4] for (u, v) in Ar: Gl.add_edge(u, v, capacity=xf[u][v].x) for (u, v) in F: val, (S, NS) = nx.minimum_cut(Gl, u, v) if val <= 0.99: aInS = [(xf[i][j], xf[i][j].x) for (i, j) in Ar if i in S and j in S] if sum(f for v, f in aInS) >= (len(S) - 1) + 1e-4: cut = xsum(1.0 * v for v, fm in aInS) <= len(S) - 1 cp.add(cut) if len(cp.cuts) > 32: for cut in cp.cuts: m_ += cut return for cut in cp.cuts: m_ += cut
def generate_constrs(self, model: Model): xf = model.translate(self.x) yf = model.translate(self.y) V_ = range(self.instance.n) cp = CutPool() for a in range(self.instance.m): edges = [[] for i in range(self.instance.n)] for (u, v) in [ (k, l) for (k, l) in product(V_, range(self.instance.n + 1)) if k != l and abs(yf[k][l][a].x) > 1e-8 ]: print(yf[u][v][a].name, yf[u][v][a].x) edges[u].append(v) # print(edges) # input() cycles = [] for i in range(self.instance.n): c = self.cycles(edges[i], i, edges, [i], []) if c: for cycle in c: cycles.append(cycle) # print('cycles', cycles, 'a ', a) # input() for c in cycles: soma = 0 rhs = len(c) - 1 for i in range(rhs): u = c[i] v = c[i + 1] soma += yf[u][v][a].x if soma > rhs - 1 + 1e-8: cut = xsum(self.y[c[i]][c[i + 1]][a] for i in range(rhs)) <= rhs - 1 # print(cut) # input() cp.add(cut) for cut in cp.cuts: model += cut print('Total cuts: {}'.format(len(cp.cuts))) input()
def generate_constrs(self, model: Model, depth: int = 0, npass: int = 0): xf, V_, cp, G = model.translate( self.x), self.V, CutPool(), nx.DiGraph() for (u, v) in [(k, l) for (k, l) in product(V_, V_) if k != l and xf[k][l]]: G.add_edge(u, v, capacity=xf[u][v].x) for (u, v) in F: val, (S, NS) = nx.minimum_cut(G, u, v) if val <= 0.99: aInS = [(xf[i][j], xf[i][j].x) for (i, j) in product(V_, V_) if i != j and xf[i][j] and i in S and j in S] if sum(f for v, f in aInS) >= (len(S) + sum( [1 if demand[i] > Q else 0 for i in S]) - 1) + 1e-4 + xsum( [x[g][l] for g in NS for l in S if (g != l)]): cut = xsum(1.0 * v for v, fm in aInS) <= len(S) - 1 + sum([ 1 if demand[i] > Q else 0 for i in S ]) + xsum([x[g][l] for g in NS for l in S if (g != l)]) cp.add(cut) if len(cp.cuts) > 256: for cut in cp.cuts: model += cut return for cut in cp.cuts: model += cut