我正在寻找一种算法来解决这个问题,而不是代码。我想尝试使用线性规划进行松弛,但也许有更有效的方法来解决这个问题?
问题描述
给定一组带权重的区间,这些区间可以重叠。需要找到最大权重的不相交区间子集。
示例
带权重的区间:
|--3--| |---1-----| |----2--| |----5----|
答案:8
我正在寻找一种算法来解决这个问题,而不是代码。我想尝试使用线性规划进行松弛,但也许有更有效的方法来解决这个问题?
问题描述
给定一组带权重的区间,这些区间可以重叠。需要找到最大权重的不相交区间子集。
示例
带权重的区间:
|--3--| |---1-----| |----2--| |----5----|
答案:8
如果没有权重,那很容易,你可以通过按它们的结束时间对区间进行排序来使用贪心算法,并在每一步中获取可能的最小结束时间间隔。
但在您的案例中,我认为这是NPC问题(需要考虑一下),但是您可以通过按“权重/长度”对每个间隔进行价值评估,并每次以排序格式获取一个可能的间隔来使用类似的贪心算法。此外,您还可以使用模拟退火,意味着每次您都可以按上述值的概率P
(p接近1
)获得最佳答案,或者以概率1-P
选择另一个间隔。您可以在while循环中执行n次以找到一个好的答案。
你可以将这个问题表述为一个整数规划问题,二进制变量指示是否选择间隔。目标函数将是变量的加权线性组合。然后,您需要适当的约束来强制在间隔之间进行排他性...... 鉴于“作业”标签,应该足够了。
此外,仅因为一个问题可以被公式化为整数规划(解决这个问题是NP-Hard)并不意味着问题类本身是NP-Hard。所以,正如Ulrich指出的那样,可能存在多项式可解的公式化/算法,例如将问题公式化/解决为线性规划。