我有以下情况:(因为我不知道显示LaTeX的方法,这是截图)
我在概念化这里发生的事情时遇到了一些麻烦。如果我要对此进行编程,我可能会尝试将其构建为某种堆,其中每个节点代表一个工作者,从最早到最晚,然后运行Prim的/ Kruskal算法。我不知道我是否正确的想法,但我需要充实我对这个问题的理解,所以我可以做到以下几点:
那么我应该把这个想法放在哪里呢?
答案 0 :(得分:3)
这个问题在性质上与“名册调度问题”非常相似。可以把委员会想象成一组“主管”,并且只要有工人在场,你就想让主管在场。在这种情况下,主管来自与工人相同的设置。
以下是一些建模思路和整数编程公式。
这最初听起来不错,但在实践中效果很好。我们将从第一班的开始时间到最后一班的结束时间创建许多“时间瞬间”T i 。它有时候有助于思考
T1, T2, T3....TN
时间(例如)相隔五分钟。对于每个Ti
,至少有一名工人正在轮班工作。因此,该时间已被覆盖(覆盖范围意味着必须至少有一名委员会成员在Ti
时间工作。)
我们真的只需要担心2n
时间瞬间:每个n
工作人员的开始和结束时间。
对于每一个瞬间Ti
,我们都希望委员会的工作人员出席。
让w1, w2...wn
成为工作人员,按其开始时间s_i
排序。 (工人w1
开始最早的班次,工人wn
从最后一班开始。)
引入一个新的指标变量(布尔值):
Y_i = 1 if worker i is part of the committeee
Y_i = 0 otherwise.
现在想一下0-1矩阵,其中行是SORTED工作者,列是时刻......
t1 t2 t3 t4 t5 t6 ... tN
-------------------------------------------
w1 1 1
w2 1 1
w3 1 1 1
w4 1 1 1
...
...
wn 1 1 1 1
-------------------------------------------
Total 2 4 3 ... ... 1 2 4 5
所以问题是要确保每列至少选择1名工作人员参与委员会。总计显示每个时刻委员会的候选人的数量。
Objective: Minimize Sum(Y_i)
Subject to:
Y1 + Y2 >= 1 # coverage for time t1
Y1 + Y2 + Y3 >= 1 # coverage for time t2
...
更一般地说,限制是:
# Set Covering constraint for time T_i
Sum over all worker i's that are working at time t_i (Y_i) >= 1
Y_i Binary for all i's
如果没有预处理就尝试这个整数程序可能非常困难,并最终扼杀解算器。但在实践中,有很多预处理的想法可以帮助很大。
∈ C
)C
。你可以把它扔进IP解算器(CPLEX,Excel,lp_solve等),如果问题的大小不是问题,你就会得到一个解决方案。
希望其中一些想法有所帮助。