2017-09-24 3 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"時間です。第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; 

、その後

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

にinventory_balanceにインデックスを微調整する。しかし、それは私のコードだったら私はそれを行うだろう注文セット:

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}と定義すると、上記のコードは引き続き動作します。 (私はいくつかのタイプミスをしていない限り、いつでも可能です!)

関連する問題