Algorithm 求最大权析取区间子集

Algorithm 求最大权析取区间子集,algorithm,Algorithm,我正在寻找一个算法,我可以用来解决这个问题,而不是代码。我想知道如何使用线性规划和放松,但也许有更有效的方法来解决这个问题 问题 我有一套权重区间。间隔可以重叠。我需要找到析取区间子集的最大权和 示例 带权重的间隔: |--3--| |---1-----| |----2--| |----5----| 回答:8你可以把这个问题表述为一个一般的IP(整数规划)问题,用二进制变量表示是否选择了一个区间。然后,目标函数将是变量的加权线性组合。然后,您需要适当的约束来强制间隔之间的析取性

我正在寻找一个算法,我可以用来解决这个问题,而不是代码。我想知道如何使用线性规划和放松,但也许有更有效的方法来解决这个问题

问题

我有一套权重区间。间隔可以重叠。我需要找到析取区间子集的最大权和

示例

带权重的间隔:

|--3--| |---1-----| |----2--| |----5----|
回答:8

你可以把这个问题表述为一个一般的IP(整数规划)问题,用二进制变量表示是否选择了一个区间。然后,目标函数将是变量的加权线性组合。然后,您需要适当的约束来强制间隔之间的析取性…考虑到
家庭作业
标记,这就足够了


此外,仅仅因为一个问题可以表述为一个整数规划(求解是NP难的),并不意味着问题类本身就是NP难的。因此,正如Ulrich指出的,可能有一种多项式可解的公式/算法,例如,将问题公式化/作为线性规划来解决。

如果没有权重,可以很容易地使用贪婪算法,通过按区间的结束时间对区间进行排序,并在每一步中获得可能的最小结束时间区间

但在你的例子中,我认为这是NPC(应该考虑一下),但你可以使用类似的贪婪算法,通过对每个区间的长度/长度进行赋值,每次都得到一个排序格式的可能区间,也可以使用模拟退火,这意味着每次你都会通过概率
p
(p接近于
1
)或选择另一个概率为1-
p
的区间。您可以在while循环中执行
n次,以找到一个好的答案。

这里有一个想法:

考虑下图:为每个间隔创建一个节点。如果间隔I1和间隔I2不重叠,且I1位于I2之前,请将一条有向边从节点I1添加到节点I2。请注意,此图是非循环的。每个节点的成本等于相应间隔的长度

现在,我们的想法是在这个图中找到最长的路径,可以在多项式时间内找到非循环图(例如,使用动态规划)。问题是成本在节点中,而不是在边上。这里有一个技巧:将每个节点v拆分为v'和v'。所有输入v的边现在都将输入v',所有离开v的边现在都将离开v'。然后,使用节点的成本(在本例中为间隔的长度)添加一条从v'到v''的边。所有其他边的成本都将为0

好吧,如果我没有弄错的话,这个图中的最长路径将对应于具有最大和的不相交区间集。

我有一个精确的O(nlog n)DP算法。因为这是作业,这里有一个线索:

按照Saeed的建议,按右边缘位置对间隔进行排序,然后从1开始计算。仅使用不延伸到间隔i右边缘右侧的间隔,将f(i)定义为可达到的最高权重

编辑:线索2:按i的递增顺序计算每个f(i)。请记住,每个间隔要么存在,要么不存在。要计算“当前”案例的分数,您需要搜索“最右边的”与interval i兼容的interval,它需要对已计算的解决方案进行二进制搜索


这是一个大问题,我不确定我能不能在不完全解释的情况下给出更多的线索;)

这里解释了正确的解决方案(端到端):

你是在寻找精确算法还是近似算法?LP松弛通常不会直接给出积分解,但可能会检查具有连续约束矩阵的公式:这样的矩阵自动完全是单模的,最优基本解将是积分的。我在《算法》一书中看到类似的内容,我不建议你买它,只是太懒了,找不到其他参考资料。那本书中的算法可能有所不同,但它可能会启发你。我欠这本书的,我会在家里研究它。我在寻找一个精确算法。你是说你更喜欢精确算法(可能需要指数时间,但当区间数很小时就可以了)而不是近似算法(即使有很多区间也可以,但答案可能不是最优的)?你有多少时间间隔?一点也不知道,我不知道测试用例。很好。但是你不能在线性时间内为DAG做最长路径吗?是的,我认为你可以在线性时间内,在图的大小(节点+边)上做。一个观察结果是:边的数量可以是O(n^2),其中n是间隔的数量。你可以使用回溯法获得精确解。你所说的“最右边”是什么意思。我不知道我的想法是否正确。f(i)是一个集合,具有区间数,它们具有最高的权重,并且是析取的?这个算法是在某本书中描述的还是你的想法?@Pawel:它可能在某个地方的书中,但我自己找到的。我所说的“最右边的,兼容的”是指其右边缘最大的间隔仍然在间隔I的左边缘的左边。很抱歉我不清楚:f(I)实际上不是一组非重叠区间本身,而是这样一组区间的权重。所以实际上我们只计算每个候选解的权重;实际上,在一个最优解中枚举区间需要像其他DP算法一样进行追溯。你现在能解释一下吗?我用另一种方法做了,但如果知道应该怎么做就好了。@Pawel:首先观察,如果a>b,那么f(a)>=f(b)——这是因为在最坏的情况下,我们总是可以为f(a)选择我们为f(b)选择的同一组间隔(并在r处留下一些“空间”) |--3--| |---1-----| |----2--| |----5----|