2017-07-25 171 views
1

以下是我嘗試運行的優化代碼的一部分。特定範圍的Pyomo約束條件

>from pyomo.environ import * 
>model = ConcreteModel() 

>## Define sets 
>model.k = Set(initialize=['Diesel','Diesel_hybrid', 'Battery_electric'], doc='Vehicle Type') 
>model.i = Set(initialize=[0,1,2,3,4,5], doc='Age') 
>model.t = Set(initialize=[2018,2019,2020,2021,2022,2023], doc='Years') 

>## Define variables 
>model.P = Var(model.k, model.t, bounds=(0,None), doc='number of k type vehicle purchased in year t') 
>model.A = Var(model.k, model.i, model.t, bounds=(0,None), doc='number of k type i year old bus in use at the end of year t') 
>model.R = Var(model.k, model.i, model.t, bounds=(0,20), doc='number of k type i year old bus salvaged at year t') 

我試圖寫的約束,說,對於總線的年齡我< = 4,公共汽車的打撈數目R [K,I,T] = 0 我嘗試以下。它似乎沒有工作。

>def constraint_5(model,k,t): 
> if (i<=4): 
>  return model.R[k,i,t] == 0 

我也試過定義一個子集。這不起作用。

>model.sal = Set(initialize=[0,1,2,3,4], doc='Minimum age in usage') 
>def constraint_5(model,k,t): 
> for i in model.w: 
>  return model.R[k,i,t] == 0 

任何人都可以幫助我嗎?由於

+0

我很高興看到有人與促銷工作。我有類似的興趣,我也在處理類似的問題。你介意給我發私人訊息嗎?你可以在我的個人資料頁面找到我的電子郵件 – Oz123

回答

0

您可以通過在所有集合的索引你的約束和使用Constraint.Skip跳過添加約束不期望指數

def constraint_5(model,k,i,t): 
    if i<=4: 
     return model.R[k,i,t] == 0 
    return Constraint.Skip 
model.con5 = Constraint(model.k,model.i,model.t,rule=constraint_5) 

,或者你可以指數在您創建

子集約束做到這一點
def constraint_5(model,k,i,t): 
    return model.R[k,i,t] == 0 
model.con5 = Constraint(model.k,model.sal,model.t,rule=constraint_5)