コード例 #1
0
ファイル: vpsolver.py プロジェクト: yuegchen/pympl
    def _generate_model(self,
                        zvars,
                        Ws,
                        ws,
                        b,
                        bounds=None,
                        binary=False,
                        labels=None,
                        prefix=""):
        """Generate an arc-flow model."""
        from pyvpsolver import MVP, AFG
        ndims = len(Ws[0])
        m = len(ws)
        bb = [0] * m
        bvars = []
        maxW = [max(Wi[d] for Wi in Ws) for d in range(ndims)]
        for i in range(m):
            if isinstance(b[i], six.string_types):
                minw = [min(wi[d] for wi in ws[i]) for d in range(ndims)]
                bb[i] = min(maxW[d] // minw[d] for d in range(ndims)
                            if minw[d] != 0)
                if bounds is not None:
                    bb[i] = min(bb[i], bounds[i])
                bvars.append(b[i])
            else:
                bb[i] = b[i]

        Cs = [1] * len(Ws)
        Qs = [-1] * len(Ws)
        instance = MVP(Ws, Cs, Qs, ws, bb, binary=binary, verbose=False)
        graph = AFG(instance, verbose=Tools.VERBOSE).graph()

        vnames = {(T, graph.S, graph.LOSS): zvar
                  for zvar, T in zip(zvars, graph.Ts)}

        ub = {}
        varl, cons = graph.get_flow_cons(vnames)
        assocs = graph.get_assocs(vnames)
        graph.names = vnames

        nopts = [len(ws[i]) for i in range(m)]

        if labels is None:
            names = ["i={}".format(i + 1) for i in range(m)]
            for i in range(m):
                if isinstance(b[i], six.string_types):
                    names[i] = b[i]
            labels = {(i, j): "{} opt={}".format(names[i], j + 1)
                      for i, j in instance.labels}
        elif isinstance(labels, list):
            labels = dict(enumerate(labels))
        graph.set_labels({(u, v, lbl): [labels[lbl]]
                          for (u, v, lbl) in graph.A if lbl in labels})

        for i in range(m):
            lincomb = []
            for j in range(nopts[i]):
                lincomb += assocs.get((i, j), [])
            if bounds is not None:
                for var in lincomb:
                    ub[var] = bounds[i]
            if isinstance(b[i], six.string_types):
                varl.append(b[i])
                cons.append((lincomb, "=", b[i]))
            else:
                if b[i] > 1:
                    cons.append((lincomb, ">=", b[i]))
                else:
                    cons.append((lincomb, "=", b[i]))

        model = Model()
        for var in varl:
            model.add_var(name=var, lb=0, ub=ub.get(var, None), vtype="I")
        for lincomb, sign, rhs in cons:
            model.add_con(lincomb, sign, rhs)

        for i, zvar in enumerate(zvars):
            flowvar = "_total_flow_{}".format(i)
            model.add_var(name=flowvar, vtype="I")
            model.add_con(flowvar, "=", zvar)

        declared_vars = set(bvars)

        def var_name(name):
            if name in zvars:
                return name
            elif name in declared_vars:
                return name
            else:
                return prefix + name

        def con_name(name):
            return prefix + name

        model.rename_vars(var_name)
        model.rename_cons(con_name)

        return graph, model, declared_vars
コード例 #2
0
ファイル: vpsolver.py プロジェクト: fdabrandao/pympl
    def _generate_model(self, zvars, Ws, ws, b, bounds=None, binary=False,
                        labels=None, prefix=""):
        """Generate an arc-flow model."""
        from pyvpsolver import MVP, AFG
        ndims = len(Ws[0])
        m = len(ws)
        bb = [0]*m
        bvars = []
        maxW = [max(Wi[d] for Wi in Ws) for d in range(ndims)]
        for i in range(m):
            if isinstance(b[i], six.string_types):
                minw = [min(wi[d] for wi in ws[i]) for d in range(ndims)]
                bb[i] = min(
                    maxW[d]//minw[d] for d in range(ndims) if minw[d] != 0
                )
                if bounds is not None:
                    bb[i] = min(bb[i], bounds[i])
                bvars.append(b[i])
            else:
                bb[i] = b[i]

        Cs = [1]*len(Ws)
        Qs = [-1]*len(Ws)
        instance = MVP(Ws, Cs, Qs, ws, bb, binary=binary, verbose=False)
        graph = AFG(instance, verbose=Tools.VERBOSE).graph()

        vnames = {
            (T, graph.S, graph.LOSS): zvar
            for zvar, T in zip(zvars, graph.Ts)
        }

        ub = {}
        varl, cons = graph.get_flow_cons(vnames)
        assocs = graph.get_assocs(vnames)
        graph.names = vnames

        nopts = [len(ws[i]) for i in range(m)]

        if labels is None:
            names = ["i={}".format(i+1) for i in range(m)]
            for i in range(m):
                if isinstance(b[i], six.string_types):
                    names[i] = b[i]
            labels = {
                (i, j): "{} opt={}".format(names[i], j+1)
                for i, j in instance.labels
            }
        elif isinstance(labels, list):
            labels = dict(enumerate(labels))
        graph.set_labels({
            (u, v, lbl): [labels[lbl]]
            for (u, v, lbl) in graph.A
            if lbl in labels
        })

        for i in range(m):
            lincomb = []
            for j in range(nopts[i]):
                lincomb += assocs.get((i, j), [])
            if bounds is not None:
                for var in lincomb:
                    ub[var] = bounds[i]
            if isinstance(b[i], six.string_types):
                varl.append(b[i])
                cons.append((lincomb, "=", b[i]))
            else:
                if b[i] > 1:
                    cons.append((lincomb, ">=", b[i]))
                else:
                    cons.append((lincomb, "=", b[i]))

        model = Model()
        for var in varl:
            model.add_var(name=var, lb=0, ub=ub.get(var, None), vtype="I")
        for lincomb, sign, rhs in cons:
            model.add_con(lincomb, sign, rhs)

        for i, zvar in enumerate(zvars):
            flowvar = "_total_flow_{}".format(i)
            model.add_var(name=flowvar, vtype="I")
            model.add_con(flowvar, "=", zvar)

        declared_vars = set(bvars)

        def var_name(name):
            if name in zvars:
                return name
            elif name in declared_vars:
                return name
            else:
                return prefix+name

        def con_name(name):
            return prefix+name

        model.rename_vars(var_name)
        model.rename_cons(con_name)

        return graph, model, declared_vars
コード例 #3
0
ファイル: vpsolver.py プロジェクト: yuegchen/pympl
    def _generate_model(self,
                        zvar,
                        W,
                        w,
                        b,
                        bounds=None,
                        binary=False,
                        labels=None,
                        prefix=""):
        """Generate an arc-flow model."""
        from pyvpsolver import VBP, AFG
        m = len(w)
        bb = [0] * m
        bvars = []
        for i in range(m):
            if isinstance(b[i], six.string_types):
                bb[i] = min(W[d] // w[i][d] for d in range(len(w[i]))
                            if w[i][d] != 0)
                if bounds is not None:
                    bb[i] = min(bb[i], bounds[i])
                bvars.append(b[i])
            else:
                bb[i] = b[i]

        instance = VBP(W, w, bb, binary=binary, verbose=False)
        graph = AFG(instance, verbose=Tools.VERBOSE).graph()
        feedback = (graph.Ts[0], graph.S, graph.LOSS)

        vnames = {}
        vnames[feedback] = zvar
        ub = {}
        varl, cons = graph.get_flow_cons(vnames)
        assocs = graph.get_assocs(vnames)
        graph.names = vnames

        if labels is None:
            labels = {i: "i={0}".format(i + 1) for i in instance.labels}
            for i in range(m):
                if isinstance(b[i], six.string_types):
                    labels[i] = b[i]
        elif isinstance(labels, list):
            labels = dict(enumerate(labels))
        graph.set_labels({(u, v, i): [labels[i]]
                          for (u, v, i) in graph.A if i in labels})

        for i in range(m):
            if i not in assocs:
                assocs[i] = []
            if bounds is not None:
                for var in assocs[i]:
                    ub[var] = bounds[i]
            if isinstance(b[i], six.string_types):
                varl.append(b[i])
                cons.append((assocs[i], "=", b[i]))
            else:
                if b[i] > 1:
                    cons.append((assocs[i], ">=", b[i]))
                else:
                    cons.append((assocs[i], "=", b[i]))

        model = Model()
        for var in varl:
            model.add_var(name=var, lb=0, ub=ub.get(var, None), vtype="I")
        for lincomb, sign, rhs in cons:
            model.add_con(lincomb, sign, rhs)

        model.add_var(name="_total_flow", vtype="I")
        model.add_con("_total_flow", "=", zvar)

        declared_vars = set(bvars)

        def var_name(name):
            if name == zvar:
                return name
            elif name in declared_vars:
                return name
            else:
                return prefix + name

        def con_name(name):
            return prefix + name

        model.rename_vars(var_name)
        model.rename_cons(con_name)

        return graph, model, declared_vars
コード例 #4
0
ファイル: vpsolver.py プロジェクト: fdabrandao/pympl
    def _generate_model(self, zvar, W, w, b, bounds=None, binary=False,
                        labels=None, prefix=""):
        """Generate an arc-flow model."""
        from pyvpsolver import VBP, AFG
        m = len(w)
        bb = [0]*m
        bvars = []
        for i in range(m):
            if isinstance(b[i], six.string_types):
                bb[i] = min(
                    W[d]//w[i][d] for d in range(len(w[i])) if w[i][d] != 0
                )
                if bounds is not None:
                    bb[i] = min(bb[i], bounds[i])
                bvars.append(b[i])
            else:
                bb[i] = b[i]

        instance = VBP(W, w, bb, binary=binary, verbose=False)
        graph = AFG(instance, verbose=Tools.VERBOSE).graph()
        feedback = (graph.Ts[0], graph.S, graph.LOSS)

        vnames = {}
        vnames[feedback] = zvar
        ub = {}
        varl, cons = graph.get_flow_cons(vnames)
        assocs = graph.get_assocs(vnames)
        graph.names = vnames

        if labels is None:
            labels = {i: "i={0}".format(i+1) for i in instance.labels}
            for i in range(m):
                if isinstance(b[i], six.string_types):
                    labels[i] = b[i]
        elif isinstance(labels, list):
            labels = dict(enumerate(labels))
        graph.set_labels({
            (u, v, i): [labels[i]]
            for (u, v, i) in graph.A
            if i in labels
        })

        for i in range(m):
            if i not in assocs:
                assocs[i] = []
            if bounds is not None:
                for var in assocs[i]:
                    ub[var] = bounds[i]
            if isinstance(b[i], six.string_types):
                varl.append(b[i])
                cons.append((assocs[i], "=", b[i]))
            else:
                if b[i] > 1:
                    cons.append((assocs[i], ">=", b[i]))
                else:
                    cons.append((assocs[i], "=", b[i]))

        model = Model()
        for var in varl:
            model.add_var(name=var, lb=0, ub=ub.get(var, None), vtype="I")
        for lincomb, sign, rhs in cons:
            model.add_con(lincomb, sign, rhs)

        model.add_var(name="_total_flow", vtype="I")
        model.add_con("_total_flow", "=", zvar)

        declared_vars = set(bvars)

        def var_name(name):
            if name == zvar:
                return name
            elif name in declared_vars:
                return name
            else:
                return prefix+name

        def con_name(name):
            return prefix+name

        model.rename_vars(var_name)
        model.rename_cons(con_name)

        return graph, model, declared_vars