利用可能な部屋と期間でいくつかの試験をスケジュールする必要がある Minizinc コードの問題に直面しています。このソフト制約の定義に問題があるだけなので、問題とコード全体をスキップします。
一部の試験は排他的またはそうでないものとしてターゲットにされています。つまり、自分自身のための余地が必要です。これはソフト制約であるため、違反の数を最小限に抑える必要があります。実際、専用の部屋を必要とする試験の同じ部屋と期間でスケジュールされた各試験は、1 つの違反としてカウントされます。
この制約に役立つデータと変数は次のとおりです。
- 試験(予定されている試験の数)
- room_exclusive (各試験で必要な排他性を表すブール値のベクトル)
- room_assignment (各検査に割り当てられた部屋の変数ベクトル)
- period_assignment (試験に割り当てられた期間の変数ベクトル)
- roomexclusivity (各試験の排他性違反をカウントする int ベクトル)
- roomexclusivity_violations (違反の総数)。
たとえば、4 つの試験が部屋を共有し、そのうちの 2 つが専用の部屋を必要とする場合、違反の合計数は 6 です。これらの 2 つのそれぞれには、同じ部屋で別の 3 つの試験があります。
最初に排他的な試験を見つけ、次に他の試験と部屋と期間を共有しているかどうかを確認するために、各試験で 2 サイクルのコントロールを作成することを考えました。問題はsum(e2 in 1..Exams, e1!=e2)にある可能性があります。これは、 Minzinc 構文でe1!=e2を配置するのが正しいかどうかわからないまま書いたためです。
constraint
forall(e1 in 1..Exams)
(roomexclusivity[e1]=sum(e2 in 1..Exams, e1!=e2)(bool2int(room_exclusive[e1]=true /\ room_assignment[e1]=room_assignment[e2] /\ period_assignment[e1]=period_assignment[e2])));
constraint
roomexclusivity_violation=sum(e in 1..Exams)(bool2int(roomexclusivity[e]>0));
私が得るエラーは(roomexclusivity [e1] ..行:
syntax error at `('; expected `)' after body expression in generator call