2017-09-11 3 views
1

を設定し、ここに私の問題を示し、簡単な例である:私は構文エラーを取得AMPL構文エラー - 制約の上にインデックスを作成最初

param N := 10; 
set C := C1 C2 C3; 
param tbar := 
    C1 2 
    C2 3 
    C3 3 ; 

# .mod file 
param N; 
set TIME := 1 .. N; 
set C ordered; 
param tbar {C}; 
var X {C,TIME} >= 0; 

minimize cost: sum {c in C} X[c,N]; 

subject to C1 {c in C: ord(c)>1, t in 1 .. N-1}: 
    X[c,t+1] = X[c,t] + 3; 

ここ.datファイルです

test.mod, line 9 (offset 142): 
    syntax error 
context: subject to C1 {c in C: >>> ord(c)>1, <<< t in 1 .. N-1}: 

私は

0123へのインデックスの位置を変更した場合
{t in 1 .. N-1, c in C: ord(c)>1}, 

正常に動作します。問題は、私が持っていることです

{c in C: ord(c)>1, t in tbar[c] .. N-1}, 

私は位置を変更することはできません。 誰もがこのエラーが発生する理由と回避策があるかどうか知っていますか?すでに判明しましたよう

+0

解決策が見つかりました。条件は最後になければなりません:{cのC、tbar [c] .. N-1:ord(c)> 1}のcが動作します。 – ops

+0

別のオプションは条件なしで表現することです。 tbar [c] .. N-1}の{c(C diff {first(C)})のようなものが動作するはずです。この例では、どちらのバージョンを選択するかは関係ありませんが、大規模なインデックスセットの場合は、それらを生成してから再度削除するのではなく、すぐに削除するほうが効率的かもしれません。 –

答えて

0

、条件は、インデックス式の最後に次のようになります。

subject to C1 {c in C, t in 1 .. N-1: ord(c)>1}: 
    X[c,t+1] = X[c,t] + 3; 

あなたがそのようなtbar[c]として、後の式に添字としてcを使用したいし、それがある場合c = first(C)については定義されていません。

{c in (C diff {first(C)}), t in tbar[c] .. N-1} 

Geoffrey Brentの提案に従ってください。

関連する問題