有向斯坦纳树/森林算法 (Directed Steiner Tr

2023-11-24  本文已影响0人  Caucher

Steiner Tree是一个经典的NP-hard问题,问题定义不在这里重复了,主要介绍几种近年来典型的解法思路。
Steiner Forest扩展了Tree的定义,设置一组起始点集,一组终点集,要求任意一对起点-终点在Steiner Forest上有路径。
Steiner Forest并不真的是一个森林的形态,应该称之为一个子图。
最简单的启发式解法是遍历所有起点算Steiner Tree做合并(结果像是一个森林因此得名),但这显然是启发式贪婪算法,并非最优解。

1. Directed Steiner Tree Problem

1.1 精确解

1.1.1 整数线性规划ILP

1.1.1.1 基于流的模型

image.png

1.1.1.2 基于路径的模型

此模型需要首先把从root到所有终点的所有路径全部找出来,然后建立规划模型。
a. 总权重最小。
b. 每个终点至少有一条路。
c. 如果一条边没有被选,那么不能有通过这条边的路径被选。


image.png

1.1.2 Dreyfus-Wagner算法

速度较差,暂略过。

1.2 近似解

1.2.1 基于最短路的算法

当终点只有一个的时候,Steiner Tree问题变成最短路问题,因此可从最短路算法补充边

1.2.1.1 最短路合并

找所有的最短路,合并之。
很简单,但是存在一个问题,如下图,过于贪婪导致不会使用已有树中边。


image.png

1.2.1.2 最短束

一个束是root到某一个中间节点v,然后v到所有的终点的最短路。
中间节点v需要遍历去寻找,只要root到v有路径,v到所有终点有路径,就可以尝试构造束。
然后选最短束即可。

1.2.2 基于最小生成树的算法

当整个图的点全都是终点的时候,Steiner Tree问题变成最小生成树问题(有向,从root可达其它所有点),因此可从最小生成树删除边得到近似解。

1.2.2.1 贪婪算法

从root开始使用Prim算法, 逐一加入与已加入点距离最近的点,直到所有终点都加入进来。
然后只保留到终点的路径其它点和边全部去掉。

1.2.3 近似算法的总结

image.png
上一篇 下一篇

猜你喜欢

热点阅读