1

期日スケジューリング問題のモデルを作成しようとしています。数学的解はよく知られており、ここで見つけることができます: http://www.stomp9.fr/master/benchmarc.pdf

私のコードはすでに問題ないように見えますが、20 行目に max() の引数が無効であるというエラーが表示されます。私はマニュアルを読み、例を調べましたが、問題ないようです。

誰かがこの問題について手がかりを持っていますか?

# $ glpsol -m file.mod [-d arquivo-dados] -o file.mod.out.txt

param d; # Due Date
param R; # "BigR"
param n; # n-1 tasks
param N; # n   tasks

set TASKS;

param p{ TASKS };
param a{ TASKS };
param b{ TASKS };

# Contraint 6
var   s{ TASKS } >= 0;
var   E{ TASKS } >= 0;
var   T{ TASKS } >= 0;

# Contraints 2 and 3
# Payoff {s in STATES[nPeriods]} : C[nPeriods,s] >= max(0, S[nPeriods,s] - Kstrike);
EARLYS { t in TASKS } : E[t] = max(0, d - (s[t] + p[t])    );
TARDIS { t in TASKS } : T[t] = max(0,     (s[t] + p[t]) - d);

# Constraint 7
var   X{ TASKS, TASKS } binary;

# Constraints 4 and 5
s.t. iB4k { i in 1..n, k in n+1..N  }: s[i] + p[i] <= s[k] + R * (1 - X[i,k]);
s.t. kB4i { i in 1..n, k in n+1..N  }: s[k] + p[k] <= s[1] + R *      X[i,k];

minimize penaltyes: sum{ t in TASKS } ( a[t]*E[t] + b[t]*T[t]);

solve;

printf "DueDate = %4d\n", d;
printf "BigR    = %4d\n", R;
printf { t in TASKS } "p[%2d] a[%2d] b[%2d]\n", p[t], a[t], b[t];

data;

param d :=  23; # Due Date
param R := 117; # "BigR" => Whole schedule time + 1
param n :=   9; # n-1 tasks
param N :=  10; # n   tasks

param: TASKS :   p     a      b :=
           1    20     4      5
           2     6     1     15
           3    13     5     13
           4    13     2     13
           5    12     7      6
           6    12     9      8
           7    12     5     15
           8     3     6      1
           9    12     6      8
          10    13    10      1;

end;
4

1 に答える 1

2

何人かの友人がエラーを見つけるのを手伝ってくれました:変数で max を使用できませんでした。彼は、T[t] と E[t] の両方が >= 0 であることを既に定義していたので、max は必要ないはずだと指摘しました。

そのため、max() を削除し、エラーの検索中に導入した他の小さなエラーを修正しました (まあ、それが私たちが選んだ人生です;) とその実行。実際の例は次のとおりです(期日を変更しました)

# $ glpsol -m file.mod [-d arquivo-dados] -o file.mod.out.txt
# mathematical formulation: http://www.stomp9.fr/master/benchmarc.pdf

param d; # Due Date

set TASKS;

param p{ TASKS };      # Processing time
param a{ TASKS };      # earlyness penalty
param b{ TASKS };      # tardiness penalty

param R := sum{ t in TASKS } p[t]; # "BigR"

# Contraint 6
var   s{ TASKS } >= 0; # start
var   E{ TASKS } >= 0; # Earliness
var   T{ TASKS } >= 0; # Tardiness

# Constraint 7
var   X{ TASKS, TASKS } binary;

# Constraints 4 and 5
s.t. iB4k { i in TASKS, k in TASKS : i < k } : s[i] + p[i] <= s[k] + R * (1 - X[i,k]);
s.t. kB4i { i in TASKS, k in TASKS : i < k } : s[k] + p[k] <= s[i] + R *      X[i,k];

# Contraints 2 and 3
s.t. EARLYS { t in TASKS } : E[t] >= d - (s[t] + p[t])    ;
s.t. TARDIS { t in TASKS } : T[t] >=     (s[t] + p[t]) - d;

minimize penaltyes: sum{ t in TASKS } ( a[t]*E[t] + b[t]*T[t]);

solve;

printf "DueDate = %4d\n", d;
printf "BigR    = %4d\n", R;
printf { t in TASKS } "p[%2d] a[%2d] b[%2d]\n", p[t], a[t], b[t];

data;

param d :=  92; # Due Date

param: TASKS :   p     a      b :=
           1    20     4      5
           2     6     1     15
           3    13     5     13
           4    13     2     13
           5    12     7      6
           6    12     9      8
           7    12     5     15
           8     3     6      1
           9    12     6      8
          10    13    10      1;

end;
于 2015-06-22T00:55:59.490 に答える