我正在尝试解决一个优化问题,它最终归结为:给定一组加权间隔S,我试图找到S中的最小间隔数,使它们跨越预定义的,可推测的更大的间隔我和最大的重量。首先,看起来我们可以减少这个问题的集合覆盖问题,但是间隔的连续性意味着集合也必须是“连续的”。 ?或问题是多目标?
答案 0 :(得分:0)
这个问题至少允许一个简单的动态编程解决方案。
考虑细分的所有端点。按坐标排序。
对于每个端点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)
。也许存在更快的解决方案,但我现在想不到一个。