Генерация значения в пошаговой функции на основе переменной - PullRequest
0 голосов
/ 14 февраля 2019

Я создаю модель оптимизации, используя gurobi, и у меня возникли проблемы с одним из моих ограничений.Ограничение используется для определения количества и основывается на кривых спроса и предложения.Кривые предложения вызывают проблемы, поскольку это ступенчатая кривая.Как видно из кода, проблема заключается в том, что я пишу раздел def MC.

Demand_Curve1_const = 250
Demand_Curve1_slope = -0.025
MC_water = 0
MC_gas = 80
MC_coal = 100
CAP_water = 5000
CAP_gas = 2500
CAP_coal = 2000

model = pyo.ConcreteModel()


model.Const_P1 = pyo.Param(initialize = Demand_Curve1_const)

model.slope_P1 = pyo.Param(initialize = Demand_Curve1_slope)

model.MCW = pyo.Param(initialize = MC_water)
model.MCG = pyo.Param(initialize = MC_gas)
model.MCC = pyo.Param(initialize = MC_coal) 

model.CW = pyo.Param(initialize = CAP_water)
model.CG = pyo.Param(initialize = CAP_gas)
model.CC = pyo.Param(initialize = CAP_coal)

model.qw = pyo.Var(within = pyo.NonNegativeReals)
model.qg = pyo.Var(within = pyo.NonNegativeReals)
model.qc = pyo.Var(within = pyo.NonNegativeReals)
model.d = pyo.Var(within = pyo.NonNegativeReals)

def MC():
    if model.d <=5000:
        return model.MCW
    if model.d >= 5000 and model.d <= 7500:
        return model.MCG
    if model.d >= 7500 :
        return model.MCC

def Objective(model):
    return(model.Const_P1*model.d + model.slope_P1*model.d*model.d - (model.MCW*model.qw + model.MCG*model.qg + model.MCC*model.qc))
model.OBJ = pyo.Objective(rule = Objective, sense = pyo.maximize)


def P1inflow(model):
    return(MC == model.Const_P1+model.slope_P1*model.d*2)
model.C1 = pyo.Constraint(rule = P1inflow)

1 Ответ

0 голосов
/ 15 февраля 2019

Ваша функция MC, как указано, сделает модель нелинейной и довольно неприятной (прерывистой).

Кусочно-линейные функции часто моделируются через двоичные переменные или наборы SOS2 (специальные упорядоченные наборы типа 2).Поскольку вы используете Pyomo, вы также можете использовать инструмент, который может автоматически генерировать составы MIP.Смотри help(Piecewise).

Пример, который подходит вашему описанию: здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...