【问题标题】:Weighted interval scheduling with variable weights具有可变权重的加权间隔调度
【发布时间】:2013-08-15 12:11:10
【问题描述】:

在传统的加权区间调度问题中,我们有一个权重为 w_j 的区间列表 {i_1, ..., i_n}。解决加权区间调度问题的算法是here,是一个基本的动态规划问题。但是,如果在调度中,选定间隔的权重取决于它之前的间隔的权重(反过来,权重取决于顺序),会发生什么?一个例子是w_j' = w_j'*(w_(j-1)' + 1),其中已启动的变量是内在权重,未启动的权重是考虑到顺序的“实际”权重,即您实际用于目标函数的权重。这个问题是NP难的吗?听起来确实如此。

编辑:为了使这更容易(也更现实),让我们假设离散的单位时间。

【问题讨论】:

  • 仔细研究这个问题,我想知道为什么我们不能只使用 DP 以便子问题是“我们可以在时间 t 之前完成什么并以工作 j 结束”而不仅仅是“在时间 t 之前我们能完成什么”
  • @DennisMeng 因此,您的建议是迭代开始/结束时间,例如,查看结束时间为t 的所有作业,然后尝试使用以前的计算将它们放入计划中通知链的其余部分,然后转到t+1?
  • 如果通过“使用以前的计算来通知链的其余部分”,你的意思是“使用以前的计算来找出我从一开始就可以做的最好的事情t”,那么我认为你有正确的想法。我的建议与原始问题中所做的主要区别在于,当我们查看以前的计算时,我们不仅关心我们计算到什么时间,还关心上次使用的工作是什么那个计算。
  • @DennisMeng 好的,谢谢。最后一件事:如果我理解你在说什么,你的建议是默认计算重量所涉及的函数都在增加。例如,如果其中一个函数是f(x) = 1/(|x| + 1),并且我们打算将前面间隔的权重总和提供给它,那么我们希望这些权重的总和尽可能接近于零。这通常会破坏算法。
  • 嗯,我想这是真的。感谢您清理那部分。

标签: algorithm scheduling intervals


【解决方案1】:

好吧,我想通了。算法是(如果我错了请纠正我):

for t in times:
    if is_first(t):
        best_candidate = None
    else:
        best_candidate = best(t - 1)

    for interval in intervals if interval.end_time is t:
        value_i = f(best(interval.start_time) + interval)
        value_candidate = f(best_candidate)
        if value_i > value_candidate:
            best_candidate = best(interval.start_time) + interval

    best(t) = best_candidate

return best(times[-1])

集合times, intervals 是区间和区间本身的潜在时间停止,f 是目标函数。

迭代之间的常数是:随着时间的推移t 的迭代完成后,best(t) 是以t 结尾的最佳调度。请注意,由于初始化步骤,best(t) == best(t - 1) 是可能的。另请注意,正如我的评论中那样,这仅在f 单调增加时才有效,因为f 旨在根据之前的间隔应用于每个单独的间隔。我以这里的方式使用它作为速记。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多