【问题标题】:A variation of weighted interval scheduling加权间隔调度的一种变体
【发布时间】:2015-07-28 13:51:18
【问题描述】:

我试图解决一个优化问题,它最终归结为:给定一组加权间隔 S ,我试图找到 S 中的最小间隔数,以便它们跨越一个预定义的、可能更大的间隔我和有最大的重量。首先,看起来我们可以将集合覆盖问题简化为这个问题,但是区间的连续性意味着集合也必须是“连续的”?还是问题是多目标的?

【问题讨论】:

  • 您想要最小数量还是最大重量?或者在所有最小数量的情况下,找到最大重量?
  • 仅找到最大权重是微不足道的。解决方案集将包含与 I 相交的所有区间。我需要跨越区间 I 的最小数字,如果有超过 1 个解决方案,那么我会更喜欢体重最大的那个。
  • 所以您需要最少数量的间隔来完全覆盖整个I,并且在所有这些解决方案中,需要最大化权重的那个?
  • 这正是我想要的。

标签: algorithm optimization


【解决方案1】:

这个问题至少允许一个简单的动态规划解决方案。

考虑分段的所有端点。按坐标排序。

对于每个端点X,计算从I 的开始(将此开始表示为S)到X 的整个区间的最小段数。执行如下操作:遍历覆盖点 X 的所有段。对于每个细分市场,请尝试将其带到您的解决方案中。然后你必须用最少的段覆盖从S 到这个段的开始的区间,以及所有这些具有最大权重的解决方案——你已经在你的动态规划中计算了这个答案。因此,现在在您迭代所有细分之后,只需选择最佳解决方案即可。

类似(伪代码)

crop all given segments if they stretch outside of I, now each segment lies in I
sort all endpoints of your segments, assume X is the sorted array and L its length
if (X[0]!=I.left) or (X[L]!=I.right)
    no solution is availavle
answer[0] = 0
weight[0] = 0
for i=1..L
    answer[i] = infinity
    for j=0..N (the number of segments)
        if (X[i]>=segment[j].left) and (X[i]<=segment[j].right)
            p = position of segment[j].left in X (can be precalculated)
            candidate_answer = answer[p] + 1
            candidate_weight = weight[p] + segment[j].weight
            if (candidate_answer<answer[i]) or (
                  (candidate_answer==answer[i]) and (candidate_weigth>weight[i]))
                answer[i] = candidate_answer
                weight[i] = candidate_weight
answer[L] and weight[L] is your answer

这是O(N^2)。也许存在更快的解决方案,但我现在想不出。

【讨论】:

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