2016-11-29 267 views
1

我目前正試圖解決這個問題。我需要最大化該公司的利潤。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` 

如果有人會有提示,我該如何繼續下去會很棒。

預先感謝您, 帕特里克

回答

2

在Pyomo,規則不是發送到求解器的回調。他們被調用一次爲每個索引獲取一組靜態表達式。這組表達式是發送給解算器的。在規則中使用的任何if邏輯都不應包含變量的值(除非它基於變量的初始值,在這種情況下,無論您在主表達式之外使用它,只要將變量包含在value()中這是返回)。

如果你想建立一個分段函數的模型,你需要應用某種建模技巧來做到這一點。在一些情況下,這涉及引入離散變量(參見examples爲分段成分),在其它情況下它不(例如最大化可表示爲有限數量的仿射函數的最小分段功能時)。

+0

謝謝你的回答。 – pat96