1

Minizinc で単純なモデルを実装して、一連のタイムスロットで優先度と期間が異なるタスクをスケジュールしますが、すべてのタスクをスケジュールできるわけではないため、一部は除外され、優先度の合計を最大化しようとしていますスケジュールされたタスク。

タスクが vars の配列で定義され、スケジュールされていないタスクの時間が 0 である作業バージョンがあります。制約には、スケジュールされたタスク (when[i]>0) のみを考慮するいくつかの where 句があります。デフォルトの検索戦略は非常に遅いので、Gecode をソルバーとして使用して、よりうまく機能する別の戦略に変更しました。

現在、オプションの変数を使用して別のバージョンを実装して、where 句を取り除き、改善があるかどうかを確認しています。ただし、opt var を使用する場合、検索戦略 int_search() を定義できないようです。

それを行う方法はありますか?

作業モデルは次のとおりです (試したい検索戦略を含むソルブ句はコメントアウトされています)。

int: numtasks=100;
int: numslots=100;

set of int: TASK=1..numtasks;
set of int: SLOT=1..numslots;
array[TASK] of var opt 1..numslots: when;
array[TASK] of int: duration = [(i mod 3)+1 | i in TASK];
array[TASK] of int: prio = [(i mod 10)+1 | i in TASK]; 

include "globals.mzn";
constraint disjunctive(when, duration);

var int: obj = sum(i in TASK where not absent(when[i]))(prio[i]);
%solve ::int_search(when, input_order, indomain_random, complete) maximize obj;
solve maximize obj;

output [show(obj)," ",show(when)];
4

1 に答える 1