예제 #1
0
    def solve_cplex(self, aa, pt):
        self.lp.solve()

        status = self.lp.solution.get_status()
        if status != self.lp.solution.status.optimal:
            raise RuntimeError("Solver status: %s" % status)

        obj = self.lp.solution.get_objective_value()

        cfs = CriteriaFunctions()
        cvs = CriteriaValues()
        for cs in self.cs:
            cv = CriterionValue(cs.id, 1)
            cvs.append(cv)

            nseg = cs.value
            x_points = range(nseg)

            p1 = Point(self.points[cs.id][0], 0)

            ui = 0
            f = PiecewiseLinear([])
            for i in x_points:
                uivar = 'w_' + cs.id + "_%d" % (i + 1)
                ui += self.lp.solution.get_values(uivar)

                x = self.points[cs.id][i + 1]

                p2 = Point(x, ui)

                s = Segment("s%d" % (i + 1), p1, p2)
                f.append(s)

                p1 = p2

            s.p1_in = True
            s.p2_in = True
            cf = CriterionFunction(cs.id, f)
            cfs.append(cf)

        cat = {v: k for k, v in self.cat.items()}
        catv = CategoriesValues()
        ui_a = 0
        for i in range(1, len(cat)):
            ui_b = self.lp.solution.get_values("u_%d" % i)
            catv.append(CategoryValue(cat[i], Interval(ui_a, ui_b)))
            ui_a = ui_b

        catv.append(CategoryValue(cat[i + 1], Interval(ui_a, 1)))

        return obj, cvs, cfs, catv
def generate_random_criteria_functions(crits, gi_min = 0, gi_max = 1,
                                       nseg_min = 1, nseg_max = 5,
                                       ui_min = 0, ui_max = 1):
    cfs = CriteriaFunctions()
    for crit in crits:
        ns = random.randint(nseg_min, nseg_max)
        if crit.direction == 1:
            _gi_min, _gi_max = gi_min, gi_max
        else:
            _gi_min, _gi_max = gi_max, gi_min

        f = generate_random_piecewise_linear(_gi_min, _gi_max, ns, ui_min,
                                             ui_max)
        cf = CriterionFunction(crit.id, f)
        cfs.append(cf)

    return cfs
예제 #3
0
    def solve_glpk(self, aa, pt):
        self.lp.solve()

        status = self.lp.status()
        if status != 'opt':
            raise RuntimeError("Solver status: %s" % self.lp.status())

        obj = self.lp.vobj()

        cfs = CriteriaFunctions()
        cvs = CriteriaValues()
        for cid, points in self.points.items():
            cv = CriterionValue(cid, 1)
            cvs.append(cv)

            p1 = Point(self.points[cid][0], 0)

            ui = 0
            f = PiecewiseLinear([])
            for i in range(len(points) - 1):
                uivar = 'w_' + cid + "_%d" % (i + 1)
                ui += self.w[cid][i].primal
                p2 = Point(self.points[cid][i + 1], ui)

                s = Segment(p1, p2)

                f.append(s)

                p1 = p2

            s.p2_in = True
            cf = CriterionFunction(cid, f)
            cfs.append(cf)

        cat = {v: k for k, v in self.cat.items()}
        catv = CategoriesValues()
        ui_a = 0
        for i in range(0, len(cat) - 1):
            ui_b = self.u[i].primal
            catv.append(CategoryValue(cat[i + 1], Interval(ui_a, ui_b)))
            ui_a = ui_b

        catv.append(CategoryValue(cat[i + 2], Interval(ui_a, 1)))

        return obj, cvs, cfs, catv
def generate_random_plinear_preference_function(crits, ap_worst, ap_best):
    cfs = CriteriaFunctions()
    for crit in crits:
        worst = ap_worst.performances[crit.id]
        best = ap_best.performances[crit.id]
        if crit.direction == -1:
            worst, best = best, worst

        r = sorted([random.uniform(worst, best) for i in range(2)])

        a = Point(float("-inf"), 0)
        b = Point(r[0],0)
        c = Point(r[1],1)
        d = Point(float("inf"), 1)
        f = PiecewiseLinear([Segment('s1', a, b),
                             Segment('s2', b, c),
                             Segment('s3', c, d)])

        cf = CriterionFunction(crit.id, f)
        cfs.append(cf)

    return cfs
예제 #5
0
    cv3 = CriterionValue("c3", 0.25)
    cvs = CriteriaValues([cv1, cv2, cv3])

    f1 = PiecewiseLinear([
        Segment('s1', Point(0, 0), Point(2.5, 0.2)),
        Segment('s2', Point(2.5, 0.2), Point(5, 1), True, True)
    ])
    f2 = PiecewiseLinear([
        Segment('s1', Point(0, 0), Point(2.5, 0.8)),
        Segment('s2', Point(2.5, 0.8), Point(5, 1), True, True)
    ])
    f3 = PiecewiseLinear([
        Segment('s1', Point(0, 0), Point(2.5, 0.5)),
        Segment('s2', Point(2.5, 0.5), Point(5, 1), True, True)
    ])
    cf1 = CriterionFunction("c1", f1)
    cf2 = CriterionFunction("c2", f2)
    cf3 = CriterionFunction("c3", f3)
    cfs = CriteriaFunctions([cf1, cf2, cf3])

    app = QtGui.QApplication(sys.argv)

    sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
                                   QtGui.QSizePolicy.Expanding)
    sizePolicy.setHorizontalStretch(1)
    sizePolicy.setVerticalStretch(0)
    sizePolicy.setHeightForWidth(sizePolicy.hasHeightForWidth())

    view = _MyGraphicsview()
    view.setRenderHint(QtGui.QPainter.Antialiasing)
    view.setSizePolicy(sizePolicy)