|
1. 近似度量斯坦纳树问题
在 优化1 中我们定义了度量斯坦纳树问题:
输入是一个点集 , 其中 是必要点集, 是可选点集, 同时我们还有一个对称距离函数 使得每条边的距离为非零值 . 最后, 还有一个额外的约束条件, 即 需要满足三角不等式:
在这个例子中, 被称为度量. 该问题的目标是找到树 , 其中 是包含所有必要点和可能包含一些可选点的任意点集 , 使得代价 最小. 优化1的最后 我们讨论了一种完全无视 中可选点的算法, 该算法找到具有 必要点集 和由 定义的边权重 的加权图的最小生成树 (spanning tree) .
现在让我们证明这一算法是2-approximate, 也就是, 它可以找到最多2倍最优解代价的解.
引理 1 令为度量斯坦纳树问题的一个实例, 并且 是具有 性质的斯坦纳树. 则存在另一树 覆盖了 中的顶点, 并且只有 中的顶点使得 .
特别是将该引理应用于最优斯坦纳树, 我们可以发现存在 的生成树, 其成本至多是最优斯坦纳树成本的2倍.
证明 1 考虑使用深度优先搜索 (Depth-First-Search, DFS) 来遍历树 , 也就是, 一个序列:
按照在DFS期间考虑它们的顺序, 列出 的顶点, 包括每次递归调用结束时我们返回的一个顶点. 该序列描述了 元素的循环, 其总长度是 恰好是 , 因为这一循环恰好使用这个树的每条边2次.
现在令 为从 获取的序列 (通过移除 中顶点和保留只在 中第一次出现的顶点). 那么 包含 中所有顶点的路径, 当然此序列中也没有其他顶点, 且它的代价 最多 是循环 的代价 (这儿我们需要用到三角不等式), 那么我们可以得到 的代价最多为 . 注意 是个路径, 也是个树, 因此我们可以将 视作树 , 其中 是边集 .
举个例子, 如果我们有一个实例: , 距离函数 对存在连接的两点的边赋值1的距离, 如果两点间不存在连接, 则我们赋值2的距离.
下图是一斯坦纳树, 其代价为8:
我们使用 证明 1 中的论证来证明存在一个成本最多为16的 的生成树. 而且事实上我们可以做得更好:
首先我们以DFS遍历 , 也就是如下顺序:
如果我们将它视作一个从 开始, 并在遍历所有顶点后返回 的循环, 一些顶点访问了不止一次, 那么这个循环有代价16, 因为每条边都需要使用两次.
现在如果我们仍以DFS遍历, 但跳过所有的可选点和之前访问过的点, 那么我们会得到一个只访问所有必要点的顺序, 也就是:
代价为10
因为这条路径是通过 "裁剪" 一条成本最多为 2倍的路径获得的, 并且因为我们有三角不等式, 所以我们找到的路径也最多是 代价的2倍.
引理 1 中的因子2是 不能进一步提升的, 因为存在代价较高的度量斯坦纳树问题的实例, 其中 的最小生成树的代价接近最小斯坦纳树代价的2倍. 举个例子, 考虑如下实例:
也就是所有必要点间的距离都是2, 但是他们对于另一端点为可选点的距离为1. 则最小斯坦纳树会有 作为根, 节点 作为树叶. 该树的代价为 , 但 的最小生成树代价为 , 因为最小生成树有 个节点, 条边, 每条边代价是2.
2. 度量 vs 一般 斯坦纳树问题
一般斯坦纳树问题与度量斯坦纳树问题相似, 但我们允许任意的距离函数. 在这个情况中, 的最小生成树 不再 能够给出不错的近似解. 比如这个极端实例:
则 的最小生成树有代价 然而最小斯坦纳树的代价是2. 但是可以证明我们的度量斯坦纳树问题的2-approximate算法可以通过一些谨慎的方式转换为一般斯坦纳树问题的2-approximate算法.
引理 2 对每个 , 若存在一个可以在多项式时间内求解度量斯坦纳树问题的-approximate算法, 则同样存在一个可以在多项式时间内求解一般斯坦纳树问题的-approximate算法.
证明 2 假设我们有一个多项式时间的-approximate算法 来求解度量斯坦纳树问题, 并且我们的输入为一般斯坦纳树问题的一个实例: . 我们将展示如何在多项式时间内找到一个-approximate的解.
对于每两点 , 令 为加权图 ( 顶点集合 , 权重 ) 中从 到 的最短路径长度 (注意不是代价!). 需要注意 是满足三角不等式的函数, 因为在一个图中, 对于每三个点 , 从 到 的最短路径长度一定不能超过 到 的最短路径长度加上 到 的最短路径长度. 这使得 是度量斯坦纳树问题的一个实例, 且我们可以应用 来找到树 , 它的代价为:
注意, 对于每对点, , 如此, 若 是原始输入 的最优树, 则我们有:
结合上述两式, 可得:
现在, 从 出发, 我们根据 将每条边 代替为从 到 的最短路径来构造图 . 我们有:
我们有不等式而不是等式的原因是 的某些边可能属于多个最短路径, 所以在左边只数一次. 最后, 根据权重 获取 的生成树 . 现在树 是一个合格的斯坦纳树, 我们有:
3. 旅行商问题 (Traveling Salesman Problem, TSP)
在旅行商问题中, 我们的输入是一个点集 和一个对称距离函数 . 这个问题的目标是找到一个能够访问所有 中的节点的循环, 且总距离尽可能短.
例如, 一个司机在机场接了7名乘客, 司机需要把他们送到家并返回机场, 这就构成了一个TSP的实例, 其中 包含8个节点 (7个乘客住址和1个机场地址) 和距离函数 (或者我们可以理解成两个地点间的开车时间). 再例如, 一个DHL货车司机要进行一系列的货物配送, 然后返回仓库, 他也会遇到类似的问题. 事实上TSP是许多具体问题的基本模型, 它是组合优化中研究最多的问题之一.
我们可以区分四种TSP的版本. 一个区别是我们是否使用度量, 其中我们将限制输入中的 满足三角不等式; 或者使用任意的 的一般版本. 另一个区别是我们是否想在循环中至少访问每个节点一次, 或者说我们是否在找每个节点都恰好只访问一次解.
可以被证明, 除非 , 否则对于一般无重复的TSP, 是没有可行的近似算法的.
在 优化3 中我们将展示其他的三种版本 (无重复的度量TSP, 有重复的一般TSP和有重复的度量TSP) 从近似的角度看都是等价的.
4. 习题1
已知一无向图 . 目标是移除最小数量的边使得剩下的图不包含三角形, 也就是没有没有三个顶点的集合 使得边 和 都在剩余的图中. 提供一个能在多项式时间内运行的3-approximate算法.
4.1. 思路
基本的思路是重复在图 中寻找三角形, 并从那个三角形移除所有的边. 因为任何最优算法都必须从三角形移除至少一条边, 那么我们也必然可以得到3-approximate算法.
4.2. 算法描述
首先, 我们需要一个子路径去寻找图 中的一个三角形. 假设图以邻接矩阵的形式存储, 我们考虑一个简单算法, 它检查三个节点 的每个 组合, 并检查是否有边与它们相连. 这种方式是的算法需要 的时间复杂度去找到一个三角形 (或者汇报没有三角形). 进一步优化也是可能的.
第二步, 这个算法进行如下运算:
4.3. 为什么该算法可行
首先, 易知当算法结束时, 不会存在三角形. 则我们仅需证明为什么该算法是3-approximate算法.
定义 的一个 三角形集合 包含不相交的三角形, 也就是没有共边的三角形 (但是可以共顶点). 注意该算法会生成一个三角形集合, 因为在每次迭代之后, 它都会从图中删除 前一个三角形的所有边. 另外, 若我们表示该算法生成的三角形集合为 , 则被该算法移除的边的数量为 .
令 为要从图 中移除的最优边集 (以保证 中没有三角形). 注意对于任意的三角形集合 , 我们都可以得到 , 因为 必须 至少 移除 中的每个三角形的一条边. 因此我们可以得出结论, 被上述算法移除的边的数量是 , 所以这个算法是3-approximate算法.
<hr/>原文链接 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|