Minizinc - 为特定机器分配作业

时间:2017-06-29 11:29:57

标签: minizinc

我说n个作业和m个机器,并且有一个作业类型的作业类型数组。如果作业在作业类型数组中是特定类型,则必须将偶数编号的机器分配给奇数机器中的其他可用的机器。 minizinc有可能吗? 我在下面尝试过的片段:

WARNING: undefined result becomes false in Boolean context
(array access out of bounds)

发出以下警告

<input id="check" name="name"
<input id="Orgname" name="name"
<input id="address" name="name"

TIA

1 个答案:

答案 0 :(得分:1)

这是一个可能是您想要的模型,即将偶数编号的机器分配给标记为&#34; NC&#34;的作业。重要的约束是以下,可能是你想要的。在这里,我们使用w范围内的临时决策变量1..num_workers,然后确保NC作业的机器编号必须是偶数:

forall(job in 1..num_jobs) (
    let { var 1..num_workers: w; } in
    % Jobs with NC must be assigned to even numbered workers (machines)
   if jobtype[job] == "NC" then w mod 2 == 0 else w mod 2 == 1 endif
   /\ assignment[job,w]=1
)

这是完整的模型 - 正如我想象的那样 - 有7个工作岗位和7个工人。我假设一个工人/机器最多只能分配给一个工作。嗯,这很多猜测......

int: num_workers = 7;
int: num_jobs = 7;
array[1..num_jobs] of string: jobtype = ["NC","X","NC","X","X","NC","X"];
% decision variables
array[1..num_jobs, 1..num_workers] of var 0..1: assignment;
solve satisfy;
constraint
   forall(job in 1..num_jobs) (
     let { var 1..num_workers: w; } in
     % Jobs with NC must be assigned to even numbered workers (machines)
     if jobtype[job] == "NC" then w mod 2 == 0 else w mod 2 == 1 endif
     /\
     assignment[job,w]=1
   )
  /\ % at most one worker for each job (or perhaps not)
  forall(job in 1..num_jobs) (
     sum([assignment[job,worker] | worker in 1..num_workers]) <= 1 
  )
  /\ % and at most one job per worker (or perhaps not)
  forall(worker in 1..num_workers) (
    sum([assignment[job,worker] | job in 1..num_jobs]) <= 1
  )
;

output [
  if w == 1 then "\n" else " " endif ++
    show(assignment[j,w]) 
  ++ if w == num_workers then " (\(jobtype[j]))" else "" endif
  | j in 1..num_jobs, w in 1..num_workers
];

该模型产生144种不同的解决方案。这是第一个:

0 0 0 0 0 1 0 ("NC")
0 0 0 0 0 0 1 ("X")
0 0 0 1 0 0 0 ("NC")
0 0 0 0 1 0 0 ("X")
0 0 1 0 0 0 0 ("X")
0 1 0 0 0 0 0 ("NC")
1 0 0 0 0 0 0 ("X")