希望有人能帮助我解决这个问题!
最初的问题是生成有效的班次,如下所述:
我有这样的数组 [m,m,m,o,o,l,l,m,m,m,l,m,m,m] 具有固定长度(S),其中 m 是工作,o 是办公室,我自由了。我需要确保至少每 6m 就有两个 l 在一起 (ll)。 o 不算作工作或免费。例子:
mmlmmlmmmll is not valid (7 ms without two ls)
mmlmmlmmll is valid
mmomomommll is valid
我试图创建一个包含 0(表示 ls)和 1(表示 ms)的数组,但从数组中删除所有 o 和非连续的 ls。因此,对于上面的例子来说:
mmlmmlmmmll -> 111111100
mmlmmlmmll -> 11111100
mmomomommll -> 11111100
这样我就可以使用 slider_sum 或 at_least 约束来解决它。但是,我无法创建这个新数组,因为它的大小与原始数组 (S) 不同。一个有效的选项是在末尾用 0 填充剩余的槽,直到 S。
任何帮助表示赞赏
编辑。这是到目前为止的代码:
enum TypeOfShift = {l,m,o};
enum Staff = {John, Mike, Mary};
array[Staff, 1..30] of TypeOfShift: Roster=[|
m, m, m, l, l, o, m, m, m, m, l, l, l, m, m, m, m, m, m, l, l, m, m, m, m, m, l, l, l, l|
l, l, l, l, l, m, m, m, o, o, l, l, l, m, m, m, m, m, l, l, l, m, m, m, m, m, l, l, m, m|
m, m, l, l, m, o, m, m, m, m, l, l, l, m, m, m, m, m, m, m, m, m, m, m, m, m, l, l, l, m|];
array[Staff, 1..30] of var 0..2: RosterCalculated = array2d(Staff, 1..30,[if (Roster[i,d]==l) then 0 else (if (Roster[i,d]==o) then 2 else 1 endif) endif | i in Staff, d in 1..30]);
output[if (d==1) then "\n\(i) " ++ " " ++ show(RosterCalculated[i,d]) ++ " " else show(RosterCalculated[i,d]) ++ " " endif | i in Staff, d in 1..30];