最小匝数的网格上的生成树

时间:2018-08-03 09:25:30

标签: algorithm tree graph-theory minimum-spanning-tree spanning-tree

是否存在一种多项式算法来查找无向网格图的生成树,从而使树的匝数最少? 转弯是指两个顶点连接到一个垂直方向的边。

在这个问题中,我们在网格中有任意一组单元格,这些单元格形成一个连通的图(不仅考虑了矩形)。

例如,给定一个4 x 4的网格图(请参见下图),我们想要找到一个像右侧的树(具有6匝)而不是左侧的树(具有14个): / p>

example

关于近似算法的想法也可能有用。

1 个答案:

答案 0 :(得分:1)

我会尝试整数编程(将下面的约束和目标转换为GLPK之类的求解器可接受的格式,然后让GLPK找出最佳解决方案)。

对于图形的每个顶点v,最多有15个0-1变量

         x(v, ╵), x(v, ╶), x(v, └),

x(v, ╷), x(v, │), x(v, ┌), x(v, ├),

x(v, ╴), x(v, ┘), x(v, ─), x(v, ┴),

x(v, ┐), x(v, ┤), x(v, ┬), x(v, ┼),

其中每个变量如果描述了生成树中v的连接,则为1,否则为0。对于每个边vw,我们都有一个0-1变量y(vw),如果存在边则为1。

目标是最小化

sum_{vertices v} (  x(v, └) +   x(v, ┌) +   x(v, ┘) +   x(v, ┐) +
                  2 x(v, ├) + 2 x(v, ┴) + 2 x(v, ┤) + 2 x(v, ┬) +
                  4 x(v, ┼)).

对于每个顶点v,我们都有一个约束条件

sum_{connections c} x(v, c) = 1,

因为只有一组连接。对于每个vw边,我们都有约束条件

sum_{connections c around v with vw} x(v, c) = y(vw),
sum_{connections c around w with vw} x(w, c) = y(vw),

编码两组变量之间的对应关系。

困难的约束是连通性约束。从理论上讲,我们将其写为

for every subset S of vertices,
    sum_{edges vw such that v in S and w not in S} y(vw) >= 1,

即,每个切口都有至少一个与之交叉的边缘,但实际上,这些切口呈指数增长,这是不好的。我可以想到三种解决此问题的方法。从最简单到最困难,

  1. 仅从上述约束开始,将实例求解为最优。检查解决方案是否与深度优先搜索连接。如果不是,则添加相应的约束(例如S是已访问顶点的集合),然后解析。

  2. 通过添加变量来表示连接性约束,这些变量表示在任意顶点生成树的每个边缘的端点之间存在n - 1个容量相关单位流的存在。如果您想尝试这个,我可以详细说明。

  3. 类似于解决方案1,但我们在求解器中找到了用于线性编程松弛的切口。这需要实现最大流量(因为边缘变量可以具有0到1之间的任何浮点值)才能找到最小切割的能力以及与IP解算器的挂钩。

我们不需要无周期约束。如果一个解决方案包含一个循环,那么我们总是可以通过删除一个循环边来消除拐角,因此最优解就没有循环。