Example #1
0
    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
Example #2
0
    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
Example #4
0
 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
Example #5
0
 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
Example #6
0
    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()
Example #7
0
 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