1

タスクのリストがあり、それらの間には相互依存性があります。9つのタスク。各 cpu グループから 6 cpu 2。3 つのグループ p1、p2、p3 があります。

cost p1=4
COST p2=5
COST P3=2

異なる CPU での異なるタスクの実行時間が与えられます。タスク間でデータ データを転送する必要があります。ポイントツーポイントリンクを使用します。2 つの CPU 間のポイント ツー ポイント リンクを購入する必要があり、コストは 1 です。これらのリンクは後で再利用できます。

問題: これらの制約を指定したい。 r1!=r4 <=> b14=1; b14は、タスク 1 と 4 の間の通信の通信時間です。リンクのコストも必要です。r1: cpu タスク 1 が割り当てられています。

if r1!=r4 then cost[r1][r4]=1;

Minizinc でこれら 2 つの制約を指定する方法を教えてもらえますか? if then 制約を使用したくありません。

4

1 に答える 1

2

MiniZinc では、条件に決定変数が含まれる場合、「if 条件 then ... else ... endif」を使用できません。代わりに具体化を使用する必要があり、"->"、"<-"、"<->" を使用して記述します。

   c1 -> c2   implication
   c2 <- c1   implication (same as c1 -> c2) 
   c1 <-> c2   equivalence

したがって、2 つの制約は次のように記述する必要があります ("r1" と "r4" が決定変数であると仮定します)。

constraint 
     (r1 != r4 <-> b14=1) 
     /\
     (r1 != r4 -> cost[r1,r4] = 1)
;

「制約」セクションで複数の制約を扱う場合は、常に具体化を括弧で囲んでください。そうしないと、パーサーが制約を間違った方法で解釈する可能性があります。

また、行列の要素は次のように記述されることに注意してください。

   cost[r1,r2]

つまり、if/then/else/endif コンストラクトを使用できる場合は、具体化の翻訳は通常よりコストがかかるため、おそらくそうするべきです。

于 2014-02-27T06:36:09.180 に答える