在未定义的设定值(AMPL)中设置特定的变量值
Setting an specific variable value in a non defined set value (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?
提前致谢!
最简单的方法是:
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} 并且上面的代码仍然有效。 (除非我打错了一些错别字,这总是有可能的!)
我遇到了以下问题,可以将其从我的代码中简化为:
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?
提前致谢!
最简单的方法是:
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} 并且上面的代码仍然有效。 (除非我打错了一些错别字,这总是有可能的!)