在未定义的设置值(AMPL)中设置特定变量值

时间:2017-09-24 22:14:39

标签: constraints 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?

提前致谢!

1 个答案:

答案 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] ;

这也是一样的,但它更好地推广。例如,我可以将我的索引集t定义为{JAN_2001,FEB_2001,...,DEC_2016},上面的代码仍然有效。 (除非我做了一些错字,这总是可行的!)