假设我们应该至少有一名医生在医院值班。有n名医生(d1,d2,....,dn),第k名医生从时间a_k到时间b_k可用。为了简化问题,假设第k位医生总是从时间a_k到时间b_k工作,但我们可以选择哪些医生来上班或不上班。目标是尽量减少工作时间的总重叠。这不是间隔调度问题,因为间隔之间不能存在间隙(假设这是可实现的),但必须最小化间隔重叠。
我试图解决这个问题,将其改为图形并使用最短路径算法:让源顶点成为第一个上班的医生,终端是医生离开医院最新的终端。让边缘加权与医生之间的时间重叠。
我想知道:这类问题是否有通用名称,我可以用它来找到一些参考资料?
答案 0 :(得分:1)
可能有助于搜索"最低费用间隔时间"基于这样的想法:如果我们为每个医生分配相当于花费的时间的成本,那么最小化总成本相当于最小化重叠,因为重叠量将等于总医生时间"减去"所涵盖的总时间"。
但是,搜索这个实际上似乎没有用处。
您可以使用动态编程解决此问题。我们的想法是解决一个子问题f(t),如果我们想要从开始时间(让我们将这个时间称为0)的所有时间都覆盖到恰好时间t,则给出最小的间隔量。
显然f(0)为0,因为不需要医生。
现在假设我们已经计算了f(t)的值,所有时间t小于或等于n。我们可以通过一个简单的算法计算出f(n + 1):
考虑所有在时间n + 1完成的医生。
对于其中每一项,请考虑开始时间a_k
和结束时间b_k
之间的所有时间。 t
将代表其他医生已经涵盖的时间,因此重叠量等于t - a_k
。因此,使用该医生的费用(即重叠的总量)等于f(t) + (t-a_k)
设f(n + 1)等于找到的f(t)+(t-a_k)的最小值(如果此时没有医生完成则为无穷大)
从n = 0开始,此过程允许我们计算f(1),f(2),...,直到找到所有值。