最长路径实施的分支定界策略

时间:2015-05-03 21:10:15

标签: algorithm data-structures graph branch-and-bound longest-path

我正在研究一个我必须用分支定界算法解决的问题。假设我们有n个加油站,起点距离值不同。车站有不同的利润。我们希望最大化利润,但每个站点必须至少远离K长度。我用动态算法解决了这个问题,但是找不到分支定界算法的解决方案。实际上,我需要一个好的目标函数来确定绑定。我尝试了很多功能,但都失败了。感谢。

实施例: N = 5 设k = 10

距离值 l1 = 5,l2 = 15,l3 = 23,l4 = 30,l5 = 38

利润: p1 = 7,p2 = 3,p3 = 10,p4 = 12,p5 = 6

1 个答案:

答案 0 :(得分:0)

这是一个相当典型的包装问题。我们可以将它表示为整数程序。如果我们打开电台x_i1,请i0。然后目标是

          n
maximize sum profit_i x_i.
         i=1

限制因素是我们不在距离k内打开两个电台。我们可以在站点上滑动长度为k的窗口,为每个最大子集发出约束。对于距离值l_1 = 5, l_2 = 15, l_3 = 23, l_4 = 30, l_5 = 38k = 16,我们有约束

x_1 + x_2       <= 1    (y_1)    { 5, 15}
x_2 + x_3 + x_4 <= 1    (y_2)    {15, 23, 30}
x_3 + x_4 + x_5 <= 1    (y_3)    {23, 30, 38}.

最后,每个电台都是开放的。

for all i, x_i in {0, 1}

我们解决所有这些问题的原因如下。首先,我们可以通过将x_i in {0, 1}替换为x_i >= 0来放宽约束。现在我们有一个线性程序。我们知道

value of linear program >= value of integer program,

因为整数程序的每个解决方案都是线性程序的有效解决方案。关于线性程序的美妙之处在于它们具有双重程序,在某些技术限制下,通过LP二元性,满足

value of dual program = value of linear program >= value of integer program.

这很重要,因为这里的双程序是最小化,所以任何旧的解决方案都会给我们一个原始整数程序的限制(即我们实际关心的问题)。

双程序

这是从线性程序中机械推导出来的。我将在下面直观地解释它。一般版本:

          m
minimize sum y_j
         j=1
for all i, sum over windows j containing station i of y_j >= profit_i
for all j, y_j >= 0.

具体版本(上述具体LP的双重版本):

minimize y_1 + y_2 + y_3
y_1       >= profit_1    (x_1)
y_1 + y_2 >= profit_2    (x_2)
y_2 + y_3 >= profit_3    (x_3)
y_2 + y_3 >= profit_4    (x_4)
y_3       >= profit_5    (x_5).
y_1, y_2, y_3 >= 0.

直观地说,我们正在计算对每个窗口征税多少,以便建立任何一个站点是一个收支平衡的主张。我们收取的税收越少,电台的价值就越低。

原始 - 对偶近似

双程序可以通过LP解决(实际上可能是整数最优;这是伪装中的最短路径问题)。这是一种更容易实现的近似算法。

如果y_i出现在未满足的双重约束的左侧,则每个y_i 活动。虽然有些y_i处于有效状态,但我们会以相同的速率连续增加所有有效y_1 >= profit_1 = 1 y_1 + y_2 >= profit_2 = 2 y_2 + y_3 >= profit_3 = 4 y_2 + y_3 >= profit_4 = 5 y_3 >= profit_5 = 3. 。在实践中,我们首先找出满足哪个约束,然后直接到达该点的步骤时间。

让我们假设约束与以前一样

0

最初所有变量都是1并且处于活动状态。当他们点击profit_1时,profit_2y_1约束就会得到满足。因此y_2被停用,因为它不参与其他约束。我们继续将y_32增加到profit_3,然后满足profit_4约束。两个变量都参与2.5约束,因此它们保持活动状态。当我们增加到profit_4时,y_2约束就会得到满足,并且y_3不再有效。我们继续,将3增加到y_1 = 1,以获得y_2 = 2.5y_3 = 3以及6.5的最终解决方案,以获得值y_1 = 1。对于值y_2 = 2,最佳值为(例如)y_3 = 36以及.pusher