Minizinc - 将工作分配给特定机器
Minizinc - assign job to specific machine
我说了 n 个作业和 m 个机器,并且有一个包含作业类型的 jobtype 数组。如果作业是作业类型数组中的特定类型,我必须将可用的其他机器中的偶数机器分配给奇数机器。 minizinc可以吗?
我试过的片段如下:
forall(w in 1..num_workers) (
if jobtype[job] == "NC" then assignment[job,(w mod 2 ==0)]=1
else assignment[job,(w mod 2 !=0)]=1 endif
)
发出以下警告
WARNING: undefined result becomes false in Boolean context
(array access out of bounds)
TIA
这可能是您想要的一种模型,即将偶数编号的机器分配给标记为 "NC" 的作业。重要的约束如下,这可能是您想要的。这里我们在1..num_workers
的范围内使用一个临时的决策变量w
,然后确保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 个工人。我假设一个 worker/machine 最多只能分配给一个工作。好吧,这是很多猜测...
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")
我说了 n 个作业和 m 个机器,并且有一个包含作业类型的 jobtype 数组。如果作业是作业类型数组中的特定类型,我必须将可用的其他机器中的偶数机器分配给奇数机器。 minizinc可以吗? 我试过的片段如下:
forall(w in 1..num_workers) (
if jobtype[job] == "NC" then assignment[job,(w mod 2 ==0)]=1
else assignment[job,(w mod 2 !=0)]=1 endif
)
发出以下警告
WARNING: undefined result becomes false in Boolean context
(array access out of bounds)
TIA
这可能是您想要的一种模型,即将偶数编号的机器分配给标记为 "NC" 的作业。重要的约束如下,这可能是您想要的。这里我们在1..num_workers
的范围内使用一个临时的决策变量w
,然后确保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 个工人。我假设一个 worker/machine 最多只能分配给一个工作。好吧,这是很多猜测...
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")