0

私は MiniZinc を初めて使用し、次の CP の定式化の実装に問題があります (問題の完全な定式化については、こちら (4/16 ページ)を参照してください) 。

問題のCP定式化

私の実装は以下のコードのようですが、次のエラーに苦労しています: MiniZinc: type error: no function or predicate with this signature found: 'comulative(array[int] of var opt int,array[int] of var opt int,array[int] of var opt int,int)'.

これは、配列内包表記が var (この場合は variable ) の影響を受けるためですx

cumulativeオプション変数または考えられる回避策を使用して制約を機能させる方法について何か提案はありますか?

よろしくお願いします:-)

include "cumulative.mzn";
include "element.mzn";

int: numJ; % number of tasks
int: numI; % number of facilities

% Tasks
set of int: Tasks = 1..numJ;

% Facilities
set of int: Facilities = 1..numI;

% Max consumptions of facilities
array[Facilities] of int: C;

array[Tasks] of int: d; % due times
array[Tasks] of int: r; % release times
array[Facilities, Tasks] of int: c; % c[i,j] = consumption of task j at facility i
array[Facilities, Tasks] of int: p; % p[i,j] = processing time of task i at facility j
array[Facilities, Tasks] of int: F; % F[i,j] = fixed cost paid when task j is assigned to facility i

% start time's domain is an interval <0, maximum of due times>
array[Tasks] of var 0..max(d): s;

% assign task to a facility
% x[3] = 1 --> task 3 is assigned to facility 1
array[Tasks] of var 1..numI: x;

% something like a temporary processing time
% im not really sure about this
array[Tasks] of var 0..max(p): u;

constraint forall(j in Tasks)(
  element(
    x[j],
    [p[i,j] | i in Facilities],
    u[j]
  )
);


constraint forall(i in Facilities)(
  comulative(
    [s[j] | j in Tasks where x[j] == i],
    [p[i,j] | j in Tasks where x[j] == i],
    [c[i,j] | j in Tasks where x[j] == i],
    C[i]
  )
);




% A task cant start before its release time
constraint forall(j in Tasks)(s[j] >= r[j]);
% A task cant run longer than its due time
constraint forall(j in Tasks)(s[j] <= d[j] - u[j]);

% Minimize total cost
solve minimize sum(j in Tasks)(F[x[j],j]);

output [ "start: ", "\n", show(s), "\n", "facility: ", "\n" , show(x) , "\n"];

単純なデータセット:

C = [8, 8, 6, 5];

numJ = 12;
numI = 4;
r = [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2];

d = [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3];

c = [|8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, |8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, |6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, |5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, |];

p = [|1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |];

F = [|0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, |1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, |1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, |1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, |];
4

2 に答える 2

2

あなたは解決策を見つけたと言いましたが、これは累積を使用するバージョンです(「cumulative_opt.mzn」のoptバージョン)。

include "globals.mzn"; % includes the file "cumulative_opt.mzn"
% ....

constraint forall(i in Facilities)(
    cumulative(
    % [s[j] | j in Tasks where x[j] == i], % original
    % [p[i,j] | j in Tasks where x[j] == i], % original
    % [c[i,j] | j in Tasks where x[j] == i], % original

    [s[j] | j in Tasks where x[j] == i],
    [p[i,j] | j in Tasks], % <-- no condition clause here
    [c[i,j] | j in Tasks], % <-- no condition clause here
    C[i]
 )
);
于 2016-05-01T17:21:24.290 に答える
1

私はこの解決策を思いつきました。累積的な制約のあるものよりも理解しやすいと思います。

array[Facilities, 0..max(d)] of var 0..max(C): facilityUsageAtTime;

constraint forall(i in Facilities) (
     forall(tt in 0..max(d)) (
        facilityUsageAtTime[i,tt] = sum(j in Tasks where x[j] == i /\ s[j] <= tt /\ tt < s[j] + p[x[j], j])(c[x[j],j]) /\
        facilityUsageAtTime[i,tt] <= C[i]
     )
);

ここに投稿された@hakankの回答に大いに触発されています

于 2016-05-01T17:22:16.790 に答える