基于变量在阶跃函数中生成值

时间:2019-02-14 20:01:33

标签: optimization gurobi pyomo

我正在使用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 :(得分:0)

您所说的函数MC将使模型非线性,并且会带来相当讨厌的方式(不连续的)。

逐段线性函数通常通过二进制变量或SOS2集(类型2的特殊有序集)进行建模。在使用Pyomo时,您还可以使用可以自动为您生成MIP配方的工具。参见help(Piecewise)

适合您描述的示例是here