组合数学(Combinatorics)是数学的一个分支,主要研究有限的或者可数的离散结构的存在性、计数和构造问题。
组合优化(也叫离散优化)指在有限个可能解的集合中找出最优解的优化问题。
首先,我们通过定义对实例和问题做一个区分:
定义1.1(最优化问题的实例) 一个最优化问题的一个实例是一个二元组 ( F , c ) (F,c) (F,c),其中 F F F 是一个集合, c c c 是代价函数,从 F F F 映射到实数集合。要求找出一个 f ∈ F f\in F f∈F,使得对所有的 y ∈ F y\in F y∈F,都有 c ( f ) ≤ c ( y ) c(f)\le c(y) c(f)≤c(y) ,则 f f f 称为最优解。
定义1.2(最优化问题) 一个最优化问题包含该问题的所有实例。
简单来说,一个实例是给定了输入数据的特定问题,一个问题是所有实例的集合。
定义1.3(组合优化问题) 从一个包含有限对象的集合中,找出一个最优化的对象。
组合优化问题研究的对象是离散的,有限的。
典型的组合优化问题包括旅行商问题、调度问题、背包问题、装箱问题、最大团问题、聚类问题、图着色问题等。下面我们简单描述一下这些问题,以增强理解。
给定一个带权无向图 G = ( V , E ) G=(V,E) G=(V,E),找出图中一条权值最小的哈密顿回路。哈密顿回路是指从图中某个点出发,经过图中所有节点并回到出发点的路。图中所有顶点必须经过且只能经过一次。
TSP 问题是一个典型的组合优化问题,最优化的对象是权值之和最小的那一个对象。
TSP 问题的应用场景有:货物装配、路径规划、订单派送等等。
在图 G = ( V , E ) G=(V,E) G=(V,E) 中,如果一个顶点的子集 C C C 中的任意两个顶点都相邻,则称 C C C 是 G G G 的一个团。最大团问题即找出 G G G 中点数最多的团 C C C。
最大团问题可以应用在社交网络(如下图)、蛋白质结构分析等。例如,广告公司投放广告时,如果在几个极大团的交点处投放广告,往往可以节省成本的同时覆盖到更多的用户。
在图 G = ( V , E ) G=(V,E) G=(V,E) 中找到一个顶点集合 L L L ,使得图中任意一条边都至少有一个顶点在 L L L 中。最小顶点覆盖问题是在 G G G 中找到最小的 L L L 集合。
最小顶点覆盖问题常应用于道路监控、网络连接失败的监控分析等等。
给定一个命题逻辑公式,判断是否存在一组变量的指派,使得公式为真。
变量的任何一组指派都是该问题的一个对象,因为变量个数有限所以对象也有限,使得命题逻辑得到满足的一组指派是问题的一个最优化对象。
为了判定求解一个问题的难度,我们常常通过求解该问题算法的时间复杂度和空间复杂度来描述。
定义2.1(时间复杂度) 设 A A A 是求解问题 ω \omega ω 的算法,用 A A A 求解 ω \omega ω 的实例 I I I 时,首先把 I I I 编码为二进制串作为 A A A 的输入。如果存在函数 f : N → N f: N\to N f:N→N ,使得对任意规模为 n n n 的实例 I I I , A A A 对 I I I 的运算在 f ( N ) f(N) f(N) 内停止,则称算法 A A A 的时间复杂度为 f ( N ) f(N) f(N) 。
以上定义中,问题规模是以二进制编码的长度定义的。
每一个计算步都要有固定常数的执行时间。
下面我们从时间复杂度来对不同难度的问题分类。
定义2.2 (判定问题) 判定问题是指答案只有“Yes”和“No”的问题。
判定问题对应一个语言,所有“Yes”的实例构成了这个语言。
一个复杂性类实际上是一个语言集合,该集合中的语言具有相同的属性。
定义2.3 (P-类) 所有多项式时间可解的判定问题组成的问题称作 P 类
定义2.4 (NP-类) 所有非确定性图灵机多项式时间可解的判定问题组成的问题类称为 NP 类。
确定性图灵机对于某个状态会执行确定的指令,而非确定性图灵机则有多条可以执行的指令。
非确定性图灵机是一个不真实的计算模型,可以被其他模型在指数时间下模拟。
如何定义一个问题跟另一个问题一样难?我们引入规约的概念。如果存在一个转换 R,它对每个 B 的输入 x,产生一个 A 的等价输入 R(x),则称 B 规约到 A 。等价指将 R(x) 作为 A 的输入,得到的回答也是 B 输入 x 的正确回答。
定义2.5(多项式时间规约) 如果有一个确定性图灵机在多项式时间可计算的函数 R,它对于所有输入 x , x ∈ L 1 x\in L1 x∈L1 当且仅当 R ( x ) ∈ L 2 R(x)\in L2 R(x)∈L2,那么称 L1 规约到 L2 。
有了规约的概念,就可以比较不同问题的难度了。
定义2.6(NP完全问题,NP-compete, NPC) 如果任何一个 NP 问题都可以在多项式时间内规约到该问题,那么该问题为 NPC 问题。
NP 完全概念是针对判定问题而言的,对于组合优化问题,一般采用另一个更一般的概念: NP 难问题。
定义2.7(NP难问题, NP-hard) 求解难度至少和 NPC 问题一样困难的问题。
SAT 问题是第一个被证明的 NPC 问题。
给定一组可以被赋值为真或假的 n 个变量, X = { x 1 , x 2 , … , x n } X=\{x_1, x_2,\ldots,x_n\} X={x1,x2,…,xn},定义文字为变量或者变量的非,如 l 1 = x 1 , l 2 = ¬ x 3 l_1=x_1, l_2=\neg x_3 l1=x1,l2=¬x3 。文字的析取组成子句,如 c 1 = x 1 ∨ x 3 ∨ ¬ x 5 c_1=x_1\vee x_3\vee\neg x_5 c1=x1∨x3∨¬x5。子句的合取组成合取范式(CNF),如 F = c 1 ∧ c 2 ∧ c 3 F=c_1\wedge c_2\wedge c_3 F=c1∧c2∧c3。
定义2.8(SAT问题) 给定一个CNF公式,判断是否存在一组变量的赋值,使得CNF公式为真,如果为真就返回“SAT”和一组指派,如果不存在则返回“UNSAT”。
绝大多数的组合优化问题都很难求解,一般有以下一些途径来求解: