2017-06-19 47 views
0

我正在研究一個需要我使用python lib編碼的項目。稱爲pyomo。將索引變量的值設置爲索引表達式 - pyomo

我需要將索引變量的值設置爲索引表達式。

因此,總共有2個模型和1個創建其實例的腳本。

第一種模式:

m.i = [1,2,3] # i=1,2,3 
m.j = [1,2,3] # j=1,2,3 

m.index = Set(within=m.i*m.j) # m.index = [i]*[j] (pyomo set) 

m.a = Var(m.index) # m.a[i,j] 

m.Exp = Expression(m.index) # pyomo expression with [i,j] index 

m.Const = Constraint(m.index, rule=const_rule) 

def const_rule(m, index): 
    return m.a[index] == m.Exp[index] 

第二種模式:

m.index = ...   # same index with first model's m.index 
m.y = Var(m.index) # lets assume it has values or I can put with init command 

的run.py腳本:

instance1 = create_first_model() 
instance2 = create_second model() 

solve(instance2) 

for k in instance1.index:          
    instance1.Exp[k].expr = instance2.y[k].value 

solve(instance1) 

不久:

我需要爲這個更好的方法for循環。或更有效的方法(循環很慢...)

問候 奧坎

PS:所有的增值經銷商,集,表達和約束的是pyomo對象。

回答

0

是m.Exp一個包含Pyomo變量的表達式,還是用作一個常量(即一個可變參數)?

假設它是一個表達式,你要根據你的for循環,下面應該工作表達添加約束條件:

def _linking_con(m, k): 
    return m.Exp[k] == value(instance2.y[k]) 
instance1.linking_con = Constraint(instance1.index, rule=_linking_con) 

如果m.Exp是一個恆定值,那我就有一個可變的帕拉姆取代它

m.Exp = Param(m.index, mutable=True) 

,然後改變你的for循環到:

for k in instance1.index: 
    instance1.Exp[k] = value(instance2.y[k]) 

我不認爲有一種方法可以避免for循環

+0

我使用它作爲相互參數,但我沒有這樣編碼,因爲否則求解器不會從該約束給出任何雙變量。 – Icedkk

+0

另外,如果我把_linking_con放在任何模型中,它們將不起作用,因爲在調用模型之前沒有創建實例,因此在調用模型時會產生錯誤,這將會像instance2.y [k]不存在一樣。 – Icedkk

+0

您可以在構建兩個模型後添加約束 –