2017-09-24 61 views
0

我有以下問題,它可以從我的代碼減少到:設置在非限定的設定值(AMPL)的特定變量值

set t:= 1..5; #Time periods 
set e:= 1..2; #Inventory places 
set p:= 1..3; #Products 

var Iq{p,e,t} >= 0; #Inventory variable 

#Moving variables: 
# i for sums in t 
# g for sums in e 
# j for sums in p 

subject to inventory_balance {j in p, i in t}: 
sum{g in e} Iq[j,g,i] = sum{g in e} Iq[j,g,i-1] + sum{x in k} A[j,i,x] * Mt[i] - DS[i,j] ; 

這是庫存水平,這是在時間i-1的庫存水平的「g in e」的總和加上其他事物。問題是「i-1」時間段。第一次迭代將是時間t = 1,即由於約束它將變成時間t = 0。我知道在那個時期(t = 0)庫存量是0.所以問題是,我怎樣才能在約束條件下將變量Iq [p,e,0]設置爲0?

在此先感謝!

回答

0

從你在哪裏做最簡單的方法是:

set t := 0..5; 
... 
subject to starting_inventory_zero {j in p, k in e}: Iq{j,k,0} = 0; 

,然後調整在inventory_balance索引到

{j in p, i in t: i > 0} 

但如果它是我的代碼,我會用它做有序集:

set t := 0..5 ordered; 
... 
subject to starting_inventory_zero {j in p, k in e}: Iq{j,k,first(t)} = 0; 
... 
subject to inventory_balance {j in p, i in t: ord(i) > 1}: 
sum{g in e} Iq[j,g,i] = sum{g in e} Iq[j,g,prev(i)] + sum{x in k} A[j,i,x] * Mt[i] - DS[i,j] ; 

這做同樣的事情,但它可以推廣更好。例如,我可以將我的索引集定義爲{JAN_2001,FEB_2001,...,DEC_2016},上面的代碼仍然可以工作。 (除非我做了一些拼寫錯誤,這總是可能的!)