コード例 #1
0
 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
コード例 #2
0
    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
コード例 #3
0
    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)