Pyomo: ограничение с операторами if

Я сейчас пытаюсь решить эту проблему. Мне нужно максимизировать прибыль этой компании.

Вот код, который у меня сейчас есть:

from pyomo.environ import *
from pyomo.opt import *
opt = solvers.SolverFactory("ipopt")
model = ConcreteModel()

model.x1 = Var(within=NonNegativeIntegers)
model.x2 = Var(within=NonNegativeIntegers)
model.y1 = Var(within=NonNegativeIntegers)
model.y2 = Var(within=NonNegativeIntegers)
model.b1 = Var(within=Boolean)
model.b2 = Var(within=Boolean)

model.c1 = Constraint(expr = model.x1 + model.x2 + model.y1 + model.y2 <=   7000)
model.c2 = Constraint(expr = 2*model.x1 + 2*model.x2 + model.y1 + model.y2 <= 10000)
model.c3 = Constraint(expr = model.x1  <= 2000)
model.c4 = Constraint(expr = model.x2 <= 1000)
model.c5 = Constraint(expr = model.y1 <= 2000)
model.c6 = Constraint(expr = model.y2 <= 3000)


model.z = Objective(expr= (150*model.x1 + 180*model.x2*model.b1 + 100*model.y1 + 110*model.y2*model.b2), sense=maximize)
results = opt.solve(model)

Это код, который я пытался написать для своего ограничения, которое затем использует только первый наклон, если он не превышает 2000 продуктов:

def ObjRule(model):
 if model.x1 >= 2000:
     return model.b1==1
 if model.x2 >= 2000:
     return model.b2 == 1`

Было бы здорово, если бы у кого-то был намек, как я мог бы продолжить.

заранее спасибо, Патрик


person pat96    schedule 29.11.2016    source источник


Ответы (1)


В Pyomo правила не являются обратными вызовами, отправляемыми решающей программе. Они вызываются один раз для каждого индекса, чтобы получить статический набор выражений. Этот набор выражений отправляется решающей программе. Любая if-логика, которую вы используете внутри правил, не должна включать значения переменных (если она не основана на начальном значении переменной, и в этом случае вы должны заключить переменную в value () везде, где вы используете ее вне основного выражения что возвращается).

Если вы хотите смоделировать кусочную функцию, вам нужно применить для этого какой-то трюк моделирования. В некоторых случаях это предполагает введение дискретных переменных (см. примеры для Кусочная составляющая), в других случаях - нет (например, при максимизации кусочной функции, которая может быть выражена как минимум конечного числа аффинных функций).

person Gabe Hackebeil    schedule 29.11.2016