2017-09-24 64 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},上面的代码仍然可以工作。 (除非我做了一些拼写错误,这总是可能的!)