**克里斯托菲德斯算法 (Christofides algorithm)** 是旅行商问题在度量空间（即距离对称且满足三角不等式）上的一个近似算法。 该算法可以保证相对最优哈密尔顿回路长度有3/2的近似比。尼科斯·克里斯托菲德斯 (Nicos Christofides) 于1976年首次发表了这个算法，故以他的名字命名之。 截至2017年 (2017-Missing required parameter 1=*month*!)[update]，这一算法仍然是一般性旅行商问题的算法中近似比最好的结果。

算法
--

令 *G* = (*V*,*w*) 是旅行商问题的一个实例。 即， G 是一顶点集V 上的一个完全图，函数 w 给 G 的每条边指定了一个非负实边权。
依三角不等式，对每三个顶点 u, v 和 x 都有关系 *w*(*uv*) + *w*(*vx*) ≥ *w*(*ux*).

算法可以被描述为如下伪代码。

1. 构造图上的最小的生成树 T
2. 令 O 为原图顶点集中在 T 上度数为奇数的顶点集。根据握手定理，O 中有偶数个顶点
3. 构造点集O在原完全图上的最小完美匹配M
4. 将 M 和 T 的边集取并，构造重图 H ，满足其每个顶点都是偶数度的
5. H 可以形成一个欧拉回路
6. 将前一步得到的图改造为一个哈密尔顿回路：只需要跳过前一步欧拉回路中重复的顶点即可（这个步骤又称作选取近道，"short-cutting"）。

近似比
---

算法所生成的解相对最优解有3/2的近似比。下给出简要证明。

令 C 为图上的最优旅行商回路。注意到，删除 C 上的一条边将产生原图上的一棵生成树，其总权重至少为最小生成树的总权重，亦即 *w*(*T*) ≤ *w*(*C*)。接下来，给O中的顶点编号，编号顺序依据回路C 上的顶点顺序。再将 C 做划分，得到两个边集：其一包含所有起始点为奇数编号的边，另一个则包含所有起始点为偶数编号的边。这两个边集各对应于 O 上的一个完美匹配，且匹配的总边权不超过边集的总边权。

因为两个边集是 C 的划分，二者中的某一个至多有 C 总边权的一半，因而其对应匹配的总边权不超过 C 总边权的一半。因为没有比最小完美匹配更小的匹配，所以 *w*(*M*) ≤ *w*(*C*)/2。 T 和 M 的权重总和也就是欧拉回路的权重总和，也就是至多 3*w*(*C*)/2。由于做选取近道操作并不增加权重，所有最终输出的总边权也不超过 3*w*(*C*)/2.

下界
--

存在使得克里斯托菲德斯算法近似比任意接近3/2的输入。

一类满足条件的输入由 n 个顶点组成，满足最优环路上边的权重都为 1，且在最优环路上相隔一条边的边都有权重 1 + *ε*，其中 *ε* 是一个足够小的正数。未由上述定义给出的权重由两点间的最短路径给出。

最小生成树可以从最优环路中构造，总长 *n* − 1。唯二的奇数度点是这棵树（此时也是条路径）的两个端点，其完美匹配仅由一条权重近似为 *n*/2 的单边构成。
生成树和这条单边的并集是一个回路，没有可能的近道 (short-cutting)，且其总边权近似为 3*n*/2。 而问题的最优解是使用所有权重为1或 1 + *ε* 的边构造的环路，其总权重为 *n* + (*n* − 2)*ε*，对充分小的 *ε* 可以无限靠近于 n。

例
-

|  |  |
| --- | --- |
|  | 已知：一个边权满足三角不等式的完全图 |
|  | 计算最小生成树T |
|  | 计算最小生成树中奇数度的顶点集O |
|  | 用 O 中的点构造原完全图上的一个完全子图 |
|  | 构造这个子图上的最小完美匹配M |
|  | 将生成树和匹配取并 *T* ∪ *M* 形成一个欧拉重图 |
|  | 计算欧拉回路 |
|  | 删除重复顶点，选取近道 (short-cutting)，给出算法的输出 |

参考文献
----

1. ↑  Goodrich, Michael T.; Tamassia, Roberto, , Wiley: 513–514, 2015 .
2. ↑  Nicos Christofides, Worst-case analysis of a new heuristic for the travelling salesman problem, Report 388, Graduate School of Industrial Administration, CMU, 1976.
3. ↑  Bläser, Markus, Kao, Ming-Yang (编), Springer-Verlag: 517–519, 2008  [2017-12-26], ISBN 9780387307701, （原始内容存档于2016-04-28） .

外部链接
----

* NIST 克里斯托菲德斯算法定义 （页面存档备份，存于）

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
算法 |
| --- |
|  |
| 排序 | 

|  |  |
| --- | --- |
| 比较排序 | 
* 冒泡排序
* 选择排序
* 插入排序
* 希尔排序
* 快速排序
* 归并排序
* 堆排序
* 鸡尾酒排序
* 梳排序
* 侏儒排序
* 图书馆排序
* 内省排序
* 奇偶排序

 |
|  |
| 线性时间排序 | 
* 鸽巢排序
* 基数排序
* 計數排序
* 桶排序

 |
|  |
| 并行排序 | 
* 排序网络（英语：）
* Batcher归并网络

 |
|  |
| 不实用的 | 
* Bogo排序
* 臭皮匠排序

 |
|  |
| 图 | 
* 拓撲排序

 |

 |
|  |
| 搜索 | 

|  |  |
| --- | --- |
| 列表 | 
* 线性搜索
* 二分搜索
* 插值搜尋

 |
|  |
| 树・图 | 
* 广度优先搜索
	+ 最良優先搜索（英语：）
	+ 均一开销搜索
	+ A\*
* 深度优先搜索
	+ 迭代深化深度优先搜索
	+ 深度限制搜索（日语：）
	+ 双向搜索
* 分枝限定法（英语：）

 |
|  |
| 字符串 | 
* KMP算法
* 博耶-穆尔字符串搜索算法
* AC自动机算法
* 拉宾-卡普算法
* bitap算法

 |

 |
|  |
| 最短路问题 | 
* 戴克斯特拉算法
* 贝尔曼-福特算法
* A\*搜尋演算法
* Floyd-Warshall算法

 |
|  |
| 最小生成树 | 
* 普林姆算法
* 克鲁斯克尔演算法

 |
|  |
| 最大流最小割 | 
* 福特-富尔克森算法
* 埃德蒙兹-卡普算法
* 迪尼茨算法

 |
|  |
| 线性规划 | 
* 单纯形法
* 卡马卡尔算法（英语：）

 |
|  |
| 順序統計量 | 
* 选择算法
* 中位数的中位数（英语：）

 |
|  |
| 種類 | 
* 精确算法
* 近似算法
* 随机化算法

 |
|  |
| 其他 | 
* 分治法
* 动态规划
* 贪心算法

 |
|  |
| **Category:算法** |

 |