这里主要探讨了1972年Karp发表论文是提出的21个NP完全问题及其之间的规约关系。
备注:主要参考的内容是1972年Karp的那篇论文。下面提到的教材值的是清华大学出版社出版,屈婉玲、刘田、张立昂、王捍贫四位老师编著的《算法设计与分析》。
打问号的地方是我没有理解的地方。各种疏漏在所难免,如果有什么想法或者疑问,欢迎讨论。
以及有些全角字符变乱码了...@@
1、 SAT问题(SATISFIABILITY)
(判断合取范式(有限个简单析取式的合取)是否可满足)
判断析取范式(有限个简单合取式的析取)是否为永真式。
2、 0-1整数规划(0-1 INTEGERPROGRAMMING)
对整形矩阵C和整形向量d,判断是否存在0-1向量x,s.t. Cx=d.
(使用=的形式处理≥的形式的方法是引入松弛变量,不是特别显然,只是比较显然。)
1à2 记SAT问题中有n个简单析取式C1~Cn,p个变元x1~xp。
取C为一个n行p列的矩阵,d和x均p元列向量。若Ci中有xj,则cij=1;有┐xj,则为-1,若均无,则为0。di=1-ci中的┐的数量。
x表示xi的真值表。若有x,s.t.Cx≥d,则对应SAT可满足。
3、 最大团(CLIQUE)
判断图G中是否存在规模为K的团。
1à3记SAT问题中有n个简单析取式C1~Cn,p个变元x1~xp。
V={<s,i> | s是Ci的文字}
E={{<s,i>,<d,j>} |ij不等,且sd不矛盾(不互为非)}
4、 (SET PACKING)
判断集合族中是否存在l个两两不交的集合。
3à4集合数n=|V|,l=K
构建集合Si是从第i个点出发的到其它所有点的边中不在E中的那些。
于是,Si∩Sj=∅当且仅当ij∈ E。
5、 最小点覆盖(NODE COVER)
判断是否存在G中规模≤l的点集覆盖G中所有弧(E)
3à5 未被点覆盖选中的点间在图中无边,在补图中成团。
即补图中存在规模为|V|-K的点覆盖则原图中存在规模为K的团。
6、 集合覆盖 (SET COVERING)
判断有限集P的有限子集族是否存在规模不超过l的的覆盖。
5à6全集是G中的边,集族中Si=第i个点相邻的边的集合。
7、 反馈节点集(FEEDBACK NOTE SET)
对有向图H和正整数k,问是否存在规模不超过k的V的子集C,s.t.对H中的任一圈,都有C中的点。
5à7 将无向图中的每个边都用一组互反向有向边代替。l=k。这样由于点覆盖所有边,且考察队每个2元环,所以是等价的。
8、 反馈弧集(FEEDBACK ARC SET)
对有向图H和正整数k,问是否存在规模不超过k的E的子集C,s.t.对H中的任一圈,都有C中的弧。
5à8将无向图中每个点拆成两个点(vi,0)和(vi,1),记前者为入点,后者为出点。对每个点分裂的节点,有从入点引向出点的线。对于无向图中的每条线,分裂成两条线,均为从出点引向入点。这样,每条边变成一个环。等价性是比较显然的。
9、 有向哈密尔顿回路(DIRECTED HAMILTON CIRCUIT)
判断有向图H有没有无重复遍历所有点的有向回路。
(我还是觉得教材上用3SAT规约有向HC更简单…)
5à9 【?】
10、无向哈密尔顿回路(UNDIRECTEDHAMILTON CIRCUIT)
判断无向图G有没有无重复遍历所有点的回路。
9à10如同书上的做法,将每个点拆分成出点、入点和中间点。
11、3SAT (SATISFIABILITYWITH AT MOST 3 LITERALS PER CLAUSE)
析取式:D1~Dr 文字集:u1~um及其非。
1à11 如同书上的做法,将表达式替换。
12、图着色数(CHROMATICNUMBER)
对图G,判断是否存在k染色,使相邻节点颜色相异。
11à12不失一般性的,假设3SAT变元数不小于4.
V={ui,`ui, vi,Dj}(i:1~m, j:1~r)E=vi间两两连线,每个文字和自己的非连线,vi和不同角标的文字及非连线,文字和自己所属的Dj连线。颜色数为r+1.
【我目前还不清楚为什么,不过这个图已经复杂到让我不想知道了】
13、分团覆盖(LIQUE NUMBER)
判断图G是否可分称不多于k个团。
12à13染色之后每种颜色所成的集合在补图中成团。
14、恰好覆盖(EXACT COVER)
判断是否存在子集族的一个子集是全集的分割。
(还是觉得书上用SAT证明恰好覆盖的方法更简单)
12à14【?】
15、(HITTING SET)
对U的子集族S,是否存在U的子集W,使得W与S中的每个集合的交集规模均为1.
14à15 HITTINGSET的全集为EXACT COVER的集族。HITTING SET的集族si为EXACT COVER的集族中包含si的集合所构成的集合。于是子集W在EXACT COVER中满足对含有每个元素的集合都有且仅有1个。
16、斯坦纳树(STEINER TREE)
对图G,V的子集R。w为G中的边的权重。求一个G的子树,包含R中所有点,且总权重不超过k。
14à16
恰好覆盖子集族{Sj},全集U={ui}
转换之后,V={n0}∪{sj}∪{ui} R={n0}∪{ui} 连线方面,对n0和搜索子集Sj连线,Sj和其中的每个元素uji连线,no到Sj的权重是|Sj|其余地方权重都是0.
17、(3-DIMENSIONALMATCHING)
判断T×T×T的子集U是否存在规模为|T|的子集W,其中元素在三个维度上的投影均不相同。
14à17
不失一般性的,我们假设恰好覆盖的子集族中每个子集的元素数至少为2.(这个可以通过增加全集元素来使其达到。或者说类似于分裂元素。)
【?】
18、0-1背包(KNAPSACK)
判断对r+1元整数组a1~ar,b,是否存在0-1量xi,s.t.∑ajxj=b。
14à18
r为子集族中子集个数.eji=if(ui∈sj) aj=∑eji*d^(i-1) b=1+d+d^2+…+d^(t-1) t为全集元素数。
(相当于用了一个t为d进制数来表示子集和的全空间。)
19、工作规划(JOB SEQUENCING)
有p个工作,每个工作有它要做的时间、ddl、和迟到惩罚三个参数,判断是否存在顺序使得总惩罚不超过K。
18à19
0-1背包就是极特殊的工作规划。代价和时间相同。ddl都是b。
(不过要记得加松弛变量)
20、(PARTITION)
判断s个正整数组成的集合是否可以分成和相等的两部分。
18à20
s=r+2,这s个数中包含原来背包问题的r个重量,剩下两个量用于配平。需要足够大,比如一边配b+1,另一边配∑+1-b。
21、最大割(MAX CUT)
给定图G,权重函数w:EàZ.判断是否有不小于W的割。
20à21
|V|=s,w(i,j)=ci*cjW=ceil((∑ci)^2/4).