【问题标题】:Setting an specific variable value in a non defined set value (AMPL)在未定义的设置值 (AMPL) 中设置特定的变量值
【发布时间】:2017-09-24 22:14:38
【问题描述】:

我遇到以下问题,可以从我的代码中简化为:

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?

提前致谢!

【问题讨论】:

    标签: constraints ampl


    【解决方案1】:

    最简单的方法是:

    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} 并且上面的代码仍然可以工作。 (除非我打错了字,这总是可能的!)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      相关资源
      最近更新 更多