是否存在一种多项式算法来查找无向网格图的生成树,从而使树的匝数最少? 转弯是指两个顶点连接到一个垂直方向的边。
在这个问题中,我们在网格中有任意一组单元格,这些单元格形成一个连通的图(不仅考虑了矩形)。
例如,给定一个4 x 4的网格图(请参见下图),我们想要找到一个像右侧的树(具有6匝)而不是左侧的树(具有14个): / p>
关于近似算法的想法也可能有用。
答案 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,
即,每个切口都有至少一个与之交叉的边缘,但实际上,这些切口呈指数增长,这是不好的。我可以想到三种解决此问题的方法。从最简单到最困难,
仅从上述约束开始,将实例求解为最优。检查解决方案是否与深度优先搜索连接。如果不是,则添加相应的约束(例如S
是已访问顶点的集合),然后解析。
通过添加变量来表示连接性约束,这些变量表示在任意顶点生成树的每个边缘的端点之间存在n - 1
个容量相关单位流的存在。如果您想尝试这个,我可以详细说明。
类似于解决方案1,但我们在求解器中找到了用于线性编程松弛的切口。这需要实现最大流量(因为边缘变量可以具有0到1之间的任何浮点值)才能找到最小切割的能力以及与IP解算器的挂钩。
我们不需要无周期约束。如果一个解决方案包含一个循环,那么我们总是可以通过删除一个循环边来消除拐角,因此最优解就没有循环。