alternative

排他的代替間隔の作成に使用される OPL 制約 (スケジューリング)。

目的

一連のオプションの間隔からの 1 つ以上の間隔の選択をモデル化するために使用される OPL 制約 (スケジューリング)。

コンテキスト
モデル・ファイル (.mod)
boolean (制約が true の場合は 1、それ以外の場合は 0)

構文

alternative(a, B);
alternative(a, B, c);

Where
dvar interval a;
dvar interval B[];
dexpr int c;

説明

制約 alternative(a, {b1, .., bn}) では、{b1, .., bn} の間の排他的代替がモデル化されます。間隔 a が存在する場合、間隔 {b1, .., bn} の 1 つのみが存在し、a はその 1 つと一緒に開始および終了します。

制約 alternative(a, {b1, .., bn},c) では、セット {b1, .., bn} での c 個の間隔の選択がモデル化されます。間隔 a が存在する場合は、{b1, .., bn}c 個の間隔が存在し、その選択された間隔とともに a が開始し、終了します。a が存在しない場合は、すべての b 間隔が存在しません。一般にこの制約は、一連の候補リソースからの 1 つのリソース (または c 個のリソース) の選択をモデル化するために使用されます。また、より複雑なケースでアクティビティーの代替実行モードやタスクを実行するための代替時間ウィンドウをモデル化する場合にも使用できます。

配列 B は 1 次元配列でなければなりません。複雑さを高めるには、キーワード all を使用します。

注: メタ制約ではこの制約を使用できません。

以下のコード・サンプルでは、複数のプロセッサーでの 2 つのタスクの実行を表す 2 つの間隔変数 a1a2 を定義しています。使用可能なプロセッサーは p1p2 の 2 つです。プロセッサー pj でタスク ai を実行できるかどうかは、オプションの間隔 aij で表されます。タスクの期間は、テーブル pij で定義されているように、タスクが実行されるプロセッサーによって異なります。タスク a1a2 の前に実行する必要があり、a1 の結果は a2 の入力として使用されます。2 つのプロセッサー jk の間の通信遅延は、テーブル djk によって指定されます。

dvar interval a1;
dvar interval a1p[i in 1..2] optional size p[1,i];
dvar interval a2;
dvar interval a2p[i in 1..2] optional size p[2,i];
subject to {
  alternative(a1, a1p);
  alternative(a2, a2p);
  forall (j in 1..2, k in 1..2)
    endBeforeStart(a1p[j],a2p[k],d[j,k]);
};

以下のコードでは、配列があるキーワード allalternative で使用しています。完全な例については、<Install_dir>/opl/examples/opl/sched_optionalsched_optional.mod を参照してください。

alternative(tasks[h] [t], all(s in Skills: s.task==t) wtasks[h] [s]);