示例#1
0
def Portfolio():
    m = pe.ConcreteModel()
    m.cons = pe.ConstraintList()

    N = 5
    index = list(range(N))
    mean = [0.1, 0.3, 0.5, 0.7, 0.4]

    m.x = pe.Var(index, bounds=(0, 1))
    m.z = pe.Var(within=pe.PositiveReals)

    m.U = ro.UncSet()
    m.r = ro.UncParam(index, uncset=m.U, nominal=mean)
    r = m.r
    expr = 0
    for i in index:
        expr += (m.r[i] - mean[i])**2
    m.U.cons = pe.Constraint(expr=expr <= 0.0005)
    m.Elib = ro.uncset.EllipsoidalSet(mean,
                                      [[0.0005, 0, 0, 0, 0],
                                       [0, 0.0005, 0, 0, 0],
                                       [0, 0, 0.0005, 0, 0],
                                       [0, 0, 0, 0.0005, 0],
                                       [0, 0, 0, 0, 0.0005]])

    P = [[1, 1, 0, 0, 0],
         [-1, 1, 0, 0, 0],
         [1, -1, 0, 0, 0],
         [-1, -1, 0, 0, 0],
         [0, 0, 1, 0, 0],
         [0, 0, -1, 0, 0],
         [0, 0, 0, 1, 0],
         [0, 0, 0, -1, 0],
         [0, 0, 0, 0, 1],
         [0, 0, 0, 0, -1]]
    rhs = [0.001 + mean[0] + mean[1],
           0.001 - mean[0] + mean[1],
           0.001 + mean[0] - mean[1],
           0.001 - mean[0] - mean[1],
           0.001 + mean[2],
           0.001 - mean[2],
           0.001 + mean[3],
           0.001 - mean[3],
           0.001 + mean[4],
           0.001 - mean[4]]
    m.Plib = ro.uncset.PolyhedralSet(P, rhs)

    m.P = ro.UncSet()
    m.P.cons = pe.ConstraintList()
    for i, row in enumerate(P):
        m.P.cons.add(expr=pe.quicksum(row[j]*m.r[j] for j in m.r) <= rhs[i])

    m.Obj = pe.Objective(expr=m.z, sense=pe.maximize)
    # x0 = m.x[0]
    # expr = x0*3
    expr = sum([m.x[i] for i in index]) == 1
    m.cons.add(expr)
    m.cons.add(sum([r[i]*m.x[i] for i in index]) >= m.z)

    return m
示例#2
0
def Pooling():
    m = pe.ConcreteModel()
    m.q = pe.Var(con_feed_pool, bounds=(0, 1))
    m.y = pe.Var(con_pool_prod, within=pe.NonNegativeReals)
    m.z = pe.Var(con_feed_prod, within=pe.NonNegativeReals)

    m.U = ro.UncSet()
    m.price_product = ro.UncParam(products, nominal=price_product, uncset=m.U)
    expr = 0
    for j in products:
        expr += (m.price_product[j] - price_product[j])**2
    m.U.c = pe.Constraint(expr=expr <= 0.1)

    m.P = ro.UncSet()
    m.P.cons = pe.ConstraintList()
    for j in products:
        m.P.cons.add(m.price_product[j] - price_product[j] <= 0.01)
        m.P.cons.add(m.price_product[j] - price_product[j] >= -0.01)
    m.P.cons.add((m.price_product[0] - price_product[0]) +
                 (m.price_product[1] - price_product[1]) <= 0.01)

    m.C = ro.UncSet()
    m.C.cons = pe.ConstraintList()
    for j in products:
        m.C.cons.add(m.price_product[j] - price_product[j] <= 0.01)
        m.C.cons.add(m.price_product[j] - price_product[j] >= -0.01)
    m.C.cons.add((m.price_product[0] - price_product[0]) +
                 (m.price_product[1] - price_product[1]) <= 0.01)
    expr = 0
    for j in products:
        expr += (m.price_product[j] - price_product[j])**2
    m.C.cons.add(expr <= 0.1)

    pp = m.price_product

    obj = 0
    for i, l in con_feed_pool:
        for j in [jj for ll, jj in con_pool_prod if ll == l]:
            obj += price_feed[j] * m.y[(l, j)] * m.q[i, l]

    for l, j in con_pool_prod:
        obj -= pp[j] * m.y[(l, j)]

    for i, j in con_feed_prod:
        obj -= (pp[j] - price_feed[i]) * m.z[(i, j)]
    m.obj = pe.Objective(expr=obj, sense=pe.minimize)

    m.feed_availability = pe.Constraint(feeds, rule=feed_availability_rule)
    m.pool_capacity = pe.Constraint(pools, rule=pool_capacity_rule)
    m.product_demand = pe.Constraint(products, rule=prod_demand_rule)
    m.simplex = pe.Constraint(pools, rule=simplex_rule)
    m.prod_quality_upper = pe.Constraint(products,
                                         qualities,
                                         rule=prod_quality_rule_upper)
    m.prod_quality_lower = pe.Constraint(products,
                                         qualities,
                                         rule=prod_quality_rule_lower)

    return m
示例#3
0
def Portfolio():
    m = pe.ConcreteModel()
    m.cons = pe.ConstraintList()

    N = 5
    index = list(range(N))
    mean = [0.1, 0.3, 0.5, 0.7, 0.4]

    m.x = pe.Var(index, bounds=(0, 1))
    m.z = pe.Var(within=pe.PositiveReals)

    m.U = ro.UncSet()
    m.r = ro.UncParam(index, uncset=m.U, nominal=mean)
    r = m.r
    expr = 0
    for i in index:
        expr += (m.r[i] - mean[i])**2
    m.U.cons = pe.Constraint(expr=expr <= 0.0005)

    m.Obj = pe.Objective(expr=m.z, sense=pe.maximize)
    # x0 = m.x[0]
    # expr = x0*3
    expr = sum([m.x[i] for i in index]) == 1
    m.cons.add(expr)
    m.cons.add(sum([r[i] * m.x[i] for i in index]) >= m.z)

    return m
示例#4
0
def Facility():
    m = pe.ConcreteModel()
    # Define variables
    m.x = pe.Var(range(N), within=pe.Binary)
    # Define uncertainty set
    m.uncset = ro.UncSet()
    m.uncset.cons = pe.ConstraintList()
    # Define uncertain parameters
    m.demand = ro.UncParam(range(M), nominal=demand, uncset=m.uncset)
    m.y = ro.AdjustableVar(range(N), range(M), bounds=(0, None), uncparams=[m.demand])
    for i in range(M):
        m.uncset.cons.add(expr=pe.inequality(0.9*demand[i], m.demand[i], 1.1*demand[i]))

    # Add objective
    expr = 0
    for i in range(N):
        for j in range(M):
            expr += cost_transport[i][j]*m.y[i, j]
        expr += cost_facility[i]*m.x[i]
    m.obj = pe.Objective(expr=expr, sense=pe.minimize)

    # Add constraints
    def sum_y_rule(m, j):
        return sum(m.y[i, j] for i in range(N)) == m.demand[j]
    m.sum_y = pe.Constraint(range(M), rule=sum_y_rule)

    def max_demand_rule(m, i):
        lhs = sum(m.y[i, j] for j in range(M))
        return lhs <= max_dem[i]*m.x[i]
    m.max_dem = pe.Constraint(range(N), rule=max_demand_rule)

    # m.bound_x = pe.Constraint(expr=pe.quicksum(m.x[i] for i in m.x) >= 2)

    return m
示例#5
0
 def test_cons_nonlinear_in_uncparam(self):
     m = pe.ConcreteModel()
     m.U = ro.UncSet()
     m.w = ro.UncParam(range(3), nominal=(1, 2, 3), uncset=m.U)
     m.x = pe.Var(range(3))
     expr = pe.quicksum(m.w[i]**2 * m.x[i] for i in range(3))
     m.cons = pe.Constraint(expr=expr <= 5)
     m.obj = pe.Objective(expr=m.x[0], sense=pe.maximize)
     solver = pe.SolverFactory('romodel.reformulation')
     self.assertRaises(AssertionError, lambda: solver.solve(m))
示例#6
0
    def test_polyhedral_cons_ub(self):
        m = pe.ConcreteModel()
        m.x = pe.Var(range(2))
        m.P = ro.UncSet()
        m.w = ro.UncParam(range(2), nominal=(1, 2), uncset=m.P)
        m.P.cons = pe.ConstraintList()
        m.P.cons.add(pe.inequality(0.5, m.w[0], 1.5))
        m.P.cons.add(pe.inequality(1.5, m.w[1], 2.5))

        expr = pe.sum_product(m.w, m.x)
        m.cons = pe.Constraint(expr=expr <= 2)
        m.obj = pe.Objective(expr=m.x[0], sense=pe.maximize)
        t = ro.PolyhedralTransformation()
        t.apply_to(m)
        self.assertFalse(m.cons.active)
        self.assertTrue(hasattr(m, 'cons_counterpart_upper'))
示例#7
0
    def test_unknown_uncset(self):
        m = pe.ConcreteModel()
        m.x = pe.Var(range(2))
        m.U = ro.UncSet()
        m.w = ro.UncParam(range(2), nominal=(1, 2), uncset=m.U)
        m.obj = pe.Objective(expr=pe.sum_product(m.w, m.x), sense=pe.maximize)
        m.cons = pe.Objective(expr=pe.quicksum(m.x[i] for i in m.x) <= 4)
        m.U.cons = pe.Constraint(expr=(m.w[0] - 1)**4 + pe.sin(m.w[1]) <= 1)
        solver = pe.SolverFactory('romodel.reformulation')

        msg = "Cannot reformulate UncSet with unknown geometry: U"
        try:
            solver.solve(m)
        except RuntimeError as e:
            self.assertEqual(str(e), msg)
        else:
            self.fail('"solver.solve was expected to throw RuntimeError')
示例#8
0
    def test_ellipsoidal_cons_lb_root(self):
        m = pe.ConcreteModel()
        m.x = pe.Var(range(2))
        m.U = ro.UncSet()
        m.w = ro.UncParam(range(2), nominal=(1, 2), uncset=m.U)
        expr = ((m.w[0] - 1)**2 + 0.1 * (m.w[0] - 1) * (m.w[1] - 2) +
                (m.w[1] - 2)**2 <= 0.1)
        m.U.cons = pe.Constraint(expr=expr)

        expr = pe.sum_product(m.w, m.x)
        m.cons = pe.Constraint(expr=2 <= expr)
        m.obj = pe.Objective(expr=m.x[0], sense=pe.minimize)
        t = ro.EllipsoidalTransformation()
        t.apply_to(m, root=True)
        self.assertFalse(m.cons.active)
        self.assertTrue(hasattr(m, 'cons_counterpart'))
        self.assertTrue(hasattr(m.cons_counterpart, 'lower'))
        self.assertTrue(hasattr(m.cons_counterpart.lower, 'rob'))
示例#9
0
    def test_polyhedral_obj_max(self):
        m = pe.ConcreteModel()
        m.x = pe.Var(range(2))
        m.P = ro.UncSet()
        m.w = ro.UncParam(range(2), nominal=(1, 2), uncset=m.P)
        m.P.cons = pe.ConstraintList()
        m.P.cons.add(pe.inequality(0.5, m.w[0], 1.5))
        m.P.cons.add(pe.inequality(1.5, m.w[1], 2.5))

        expr = pe.sum_product(m.w, m.x)
        m.obj = pe.Objective(expr=expr, sense=pe.maximize)
        m.cons = pe.Constraint(expr=pe.quicksum(m.x[i] for i in m.x) <= 4)
        t = ro.PolyhedralTransformation()
        t.apply_to(m)
        self.assertFalse(m.obj.active)
        self.assertTrue(hasattr(m, 'obj_counterpart'))
        self.assertTrue(hasattr(m, 'obj_new'))
        self.assertIs(m.obj_new.sense, pe.maximize)
示例#10
0
    def test_ellipsoidal_obj_max_root(self):
        m = pe.ConcreteModel()
        m.x = pe.Var(range(2))
        m.U = ro.UncSet()
        m.w = ro.UncParam(range(2), nominal=(1, 2), uncset=m.U)
        expr = ((m.w[0] - 1)**2 + 0.1 * (m.w[0] - 1) * (m.w[1] - 2) +
                (m.w[1] - 2)**2 <= 0.1)
        m.U.cons = pe.Constraint(expr=expr)

        expr = pe.sum_product(m.w, m.x)
        m.obj = pe.Objective(expr=expr, sense=pe.maximize)
        m.cons = pe.Constraint(expr=pe.quicksum(m.x[i] for i in m.x) <= 4)
        t = ro.EllipsoidalTransformation()
        t.apply_to(m, root=True)
        self.assertFalse(m.obj.active)
        self.assertTrue(hasattr(m, 'obj_counterpart'))
        self.assertFalse(hasattr(m.obj_counterpart, 'det'))
        self.assertTrue(hasattr(m.obj_counterpart, 'rob'))
        self.assertIs(m.obj_counterpart.rob.sense, pe.maximize)
示例#11
0
    def test_construct_separation_problem(self):
        m = pe.ConcreteModel()
        m.x = pe.Var([0, 1])
        m.U = ro.UncSet()
        m.w = ro.UncParam([0, 1], nominal=(0.5, 0.5), uncset=m.U)
        m.U.c0 = pe.Constraint(expr=m.w[0] <= 1)
        m.U.c1 = pe.Constraint(expr=m.w[1] <= 1)
        # for i in m.w:
        #     m.w[i].value = 0.5.lower, m.c.expr, m.c.upper
        for i in m.x:
            m.x[i].value = 0.8
        m.c = pe.Constraint(expr=m.x[0] * m.w[0] + m.x[1] * m.w[1] <= 1)

        m.rc = ro.RobustConstraint()
        m.rc.build(m.c.lower, m.c.body, m.c.upper)

        sep = m.rc.construct_separation_problem()
        repn = generate_standard_repn(sep.obj)
        self.assertEqual(repn.linear_coefs, (0.8, 0.8))
示例#12
0
 def test_empty_uncset(self):
     m = romodel.examples.Knapsack()
     m.Uempty = ro.UncSet()
     m.w.uncset = m.Uempty
     solver = pe.SolverFactory('romodel.reformulation')
     self.assertRaises(AssertionError, lambda: solver.solve(m))
示例#13
0
max_demand = [10, 25, 30, 10]
min_demand = [0, 0, 0, 0]
feed_cons = [[1.0, 6.0, 4.0, 0.5], [4.0, 1.0, 3.0, 2.0], [4.0, 5.5, 3.0, 0.9],
             [3.0, 3.0, 3.0, 1.0], [1.0, 2.7, 4.0, 1.6]]

max_cons = [[3.00, 3.00, 3.25, 0.75], [4.00, 2.50, 3.50, 1.50],
            [1.50, 5.50, 3.90, 0.80], [3.00, 4.00, 4.00, 1.80]]
min_cons = [[0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0],
            [0.0, 0.0, 0.0, 0.0]]

m = pe.ConcreteModel()
m.q = pe.Var(con_feed_pool, bounds=(0, 1))
m.y = pe.Var(con_pool_prod, within=pe.NonNegativeReals)
m.z = pe.Var(con_feed_prod, within=pe.NonNegativeReals)

m.U = ro.UncSet()
m.price_product = ro.UncParam(products, nominal=price_product, uncset=m.U)
expr = 0
for j in products:
    expr += (m.price_product[j] - price_product[j])**2
m.U.c = pe.Constraint(expr=expr <= 0.1)
price_product = m.price_product

obj = 0
for i, l in con_feed_pool:
    for j in [jj for ll, jj in con_pool_prod if ll == l]:
        obj += price_feed[j] * m.y[(l, j)] * m.q[i, l]

for l, j in con_pool_prod:
    obj -= price_product[j] * m.y[(l, j)]