顶点染色问题
染色问题起源
染色问题起源于四色猜想。1852年,毕业于伦敦大学的格斯里(FrancisGuthrie)来到一家科研单位搞地图着色工作时,发现每幅地图都可以只用四种颜色染色。
1976年6月,在美国伊利诺斯大学的两台不同的电子计算机上,用了1200个小时,作了100亿个判断,结果没有一张地图是需要五色的,最终证明了四色定理。第一个计算机解是由美国数学家Appel和Haken与运用计算机的专家Kock三人合作的成果。
取面上任意一点作为图的顶点,若两个面有一条公共边,则它们对应的顶点有一条边。经过这样的转化地图染色问题中对面的染色就变成了对新图中的顶点染色,且要求任意两个相邻的顶点不能染同一色。
顶点染色
定理1:对任意的图G均有
X
(
G
)
≤
Δ
+
1
X(G)\le \Delta+1
X(G)≤Δ+1,其中
X
(
G
)
X(G)
X(G)为图G的色数,即能够给图G染色的最小颜色数;△为图G的最大度。
Δ
(
G
)
=
3
,
X
(
G
)
=
4
\Delta(G)=3,\ X(G)=4
Δ(G)=3, X(G)=4
定理2:设G是连通图。
假定G既不是完全图又不是奇圈,则
X
(
G
)
≤
Δ
X(G)\le \Delta
X(G)≤Δ
Δ
(
G
)
=
2
,
X
(
G
)
=
2
\Delta(G)=2,\ X(G)=2
Δ(G)=2, X(G)=2
Δ
(
G
)
=
2
,
X
(
G
)
=
3
\Delta(G)=2,\ X(G)=3
Δ(G)=2, X(G)=3
定理3:对任意的图G,若存在k-团为子图,则
X
(
G
)
≥
k
X(G)\ge k
X(G)≥k。 k-团就是k个顶点组成的完全图
v
1
,
v
4
,
v
5
v_{1},v_{4},v_{5}
v1,v4,v5构成一个3-团
X
(
G
)
≥
3
X(G)\ge 3
X(G)≥3
Welsh-Powell算法
- 将图G的顶点按度数递减排列;
- 对第一个顶点及其不邻接的顶点染第一个颜色;
- 对尚未染色的第一个及其不邻接的顶点染第二个颜色;续行此法,直到全部顶点染色完为止
首先计算各个顶点的度
d
(
v
1
)
=
4
,
d
(
v
2
)
=
4
,
d
(
v
3
)
=
3
,
d
(
v
4
)
=
3
d(v_{1})=4,\ d(v_{2})=4,\ d(v_{3})=3,\ d(v_{4})=3
d(v1)=4, d(v2)=4, d(v3)=3, d(v4)=3
d
(
v
5
)
=
2
,
d
(
v
6
)
=
2
d(v_{5})=2,\ d(v_{6})=2
d(v5)=2, d(v6)=2
然后,根据顶点度从大到小排序
V1 -V2 - V3- V4 - V5- V6
给顶点v1染上红色,然后再给所有不与v1相邻且彼此不相邻的顶点染上红色,这样的顶点只有v5,因此v5染上红色;
在剩下的顶点中,选度最大的顶点v2,给顶点v2染上绿色,然后再给所有不与v2相邻且彼此不相邻的顶点染上绿色,这样的顶点只有v6,因此v6染上绿色;
在剩下的顶点中,选度最大的顶点v3,给顶点v3染上黄色,然后再给所有不与v3相邻且彼此不相邻的顶点染上黄色,这样的顶点只有v4,因此v4染上黄色。
Welsh-Powell算法的Matlab实现
function [col ve] = ColorGraphf(g)
%输入:g图的邻接矩阵
%输出:col 着色数 ve 顶点着色情况
n = size(g, 2); %顶点数
ve = zeros([1 n]); %顶点着色情况集合
ve(1) = 1; %第一个顶点着1色
col = 0; %颜色初值
cnd = 1; %着色过的顶点数目
while cnd < n %是否所有顶点都着色
col = col + 1;%下一种颜色,从第1种颜色开始,因此co1初值为0
for i = 2:n %搜索所有没着色的顶点
if ve(i) == 0 %顶点i没有着色
flag = 1; %假设它可以着第col种颜色
%判断和i相邻的顶点中是否有着第col种颜色
for j = 1:n
if g(i, j) == 1
if ve(j) == col; %和i相邻的顶点j着第col种颜色
flag = 0;%i不能着第col种颜色
end
end
end
%i可以着第col种颜色
if flag == 1
ve(i) = col;
cnd = cnd + 1; %着色的顶点数加1个
end
end
end
end
s = [1 1 1 1 2 2 2 3 4];
t = [2 3 4 6 3 4 5 5 6];
g = graph(s, t);
ag = full(g.adjacency());
[col ve] = ColorGraphf(ag)
col = 3
ve = 1 2 3 3 1 2
染色问题的数学规划模型
顶点个数n,顶点的最大度
Δ
\Delta
Δ
引入0-1变量
x
i
k
=
{
1
,
当
v
i
着第
k
种颜色时
0
,
否则
,
i
=
1
,
2
,
…
,
n
;
k
=
1
,
2
,
…
,
Δ
+
1
x_{ik}=\left\{\begin{matrix} 1,\ 当v_{i}着第k种颜色时 \\ 0,\ 否则, \end{matrix}\right.\ i=1,2,\dots,n;\ k=1,2,\dots,\Delta+1
xik={1, 当vi着第k种颜色时0, 否则, i=1,2,…,n; k=1,2,…,Δ+1
设颜色总数为y,建立如下整数线性规划模型
m
i
n
y
,
min\ y,
min y,
s
.
t
.
{
∑
k
=
1
Δ
+
1
x
i
k
=
1
,
i
=
1
,
2
,
…
,
n
x
i
k
+
x
j
k
≤
1
,
(
v
i
,
v
j
)
∈
E
,
k
=
1
,
2
,
…
,
Δ
+
1
y
≥
∑
k
=
1
Δ
+
1
k
x
i
k
,
i
=
1
,
2
,
…
,
n
x
i
k
=
0
或
1
,
i
=
1
,
2
,
…
,
n
,
k
=
1
,
2
,
…
,
Δ
+
1
s.t.\left\{\begin{matrix} \sum_{k=1}^{\Delta+1}x_{ik}=1,\ i=1,2,\dots,n \\ x_{ik}+x_{jk}\le 1,\ (v_{i},v_{j})\in E,\ k=1,2,\dots,\Delta+1 \\ y\ge \sum_{k=1}^{\Delta+1}kx_{ik},\ i=1,2,\dots,n \\ x_{ik}=0或1,\ i=1,2,\dots,n,\ k=1,2,\dots ,\Delta+1 \end{matrix}\right.
s.t.⎩
⎨
⎧∑k=1Δ+1xik=1, i=1,2,…,nxik+xjk≤1, (vi,vj)∈E, k=1,2,…,Δ+1y≥∑k=1Δ+1kxik, i=1,2,…,nxik=0或1, i=1,2,…,n, k=1,2,…,Δ+1
染色理论应用
排课问题
两门课之间有一条边说明,至少有一个学生同时选了这两门课程例如:
张三同时选了S和N这两门课,因此在这两个点之间连一条边;
张三同时选了S和G这两门课,因此在这两个点之间连一条边
王五同时选了G和N这两门课,因此在这两个点之间连一条边;
根据问题要求,我们把问题转化为如何给顶点分组,使得在同一组内的任意两个顶点之间没有边相连。
如果给同一组的顶点染上相同的颜色,排课问题就转化为用最少的颜色给图的顶点染色的问题
首先计算各个顶点的度
d
(
S
)
=
3
,
d
(
N
)
=
5
,
d
(
G
)
=
3
,
d
(
M
)
=
2
d(S)=3,\ d(N)=5,\ d(G)=3,\ d(M)=2
d(S)=3, d(N)=5, d(G)=3, d(M)=2
d
(
R
)
=
2
,
d
(
P
)
=
1
d(R)=2,\ d(P)=1
d(R)=2, d(P)=1
然后根据顶点度从大到小排序
N-S-G-M-R-P
%N-1 S-2 G-3 M-4 R-5 P-6
s = [1 1 1 1 1 2 2 3];
t = [2 3 4 5 6 3 4 5];
g = graph(s, t);
ag = full(g.adjacency());
[col ve] = ColorGraphf(ag)
col = 3
ve = 1 2 3 3 2 2
旅行商问题(TSP问题)
旅行商问题
给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。
它是组合优化中的一个NP难问题,在运筹学和理论计算机科学中非常重要。
旅行商问题建立在图论中哈密顿问题基础上
哈密顿问题
1859年,数学家哈密顿(Hamilton)提出了一个叫做“周游世界”的游戏:
在一个正十二面体的20个顶点上,依次标注了伦敦、巴黎、莫斯科等世界上著名的大城市。要求游戏者从某个城市出发,把所有的城市都走过一次,且仅走过一次,然后回到出发点。这类问题就是图论中著名的哈密顿问题
图的哈密顿圈是指包含图的所有顶点的圈(Hamilton cycle)。
类似地,包含图的所有顶点的路称为图的哈密顿路(Hamiltonpath)。
一个图若包含哈密顿圈,则称这个图为哈密顿图(Hamiltonian graph).
哈密顿问题是图论中尚未解决的主要问题之一,目前还未找到判断一个图是否是哈密顿图的非平凡的充要条件。
定理1:
设无向图G是哈密顿图,S是V的任意的非空子集,则
p
(
G
−
S
)
≤
∣
S
∣
p(G-S)\le | S|
p(G−S)≤∣S∣。其中,p(G-S)为从G中删除S(删除S中各顶点及关联的边)后所得到的图的连通分支。
定理2:
设G是
n
(
n
≥
3
)
n(n\ge 3)
n(n≥3)阶无向简单图,如果G中任何一对不相邻的顶点度数之和都大于等于n,则G是哈密顿图。
推论:
n
(
n
≥
3
)
n(n\ge 3)
n(n≥3)阶完全图为哈密顿图。
寻找一个图的哈密顿圈问题是NP困难的
哈密顿问题扩展到网络(赋权图),如果一个网络有哈密顿圈,则圈上所有边的权重和就是这个哈密顿圈的权重。旅行商问题就是找到权重最小的哈密顿圈。因此旅行商问题的求解也是NP困难的
根据两点之间连边权重是否相同,旅行商问题可以分为对称旅行商问题和非对称旅行商问题
TSP简单实例
从长三角的四个主要城市中的某一个城市出发,每个城市走一遍,最后再回到出发城市,那么最少里程数的走法是什么?假设我们用自驾的方式
长三角主要城市自驾里程
在这个问题中,旅行商需要前往4个不同的城市。他需要找出前往这4个城市的最短路径,为此,必须计算每条可能的路径。
有时候,不确定要从哪个城市出发。你需要通过计算为旅行商找出起点和最佳路线。
假设有4个城市,你选择一个出发城市,合肥,还余下3个城市。涉及3个城市时,可能的路线有6条。
从合肥出发时,有6条可能的路线,但还可以从其他任何一个城市出发。
可能的出发城市有4个,从每个城市出发时都有6条可能的路线,因此可能的路线有4×6=24条。
每增加一个城市,需要计算的路线数都将增加。
5个城市为120,6个城市为720条,7个城市为5040条 8个城市为40320条
这就是阶乘(factorialfunction)。
假设有10个城市,可能的路线有10!=3628800。
换句话说,涉及10个城市时,需要计算的可能路线超过300万条。
因此,如果涉及的城市很多,用穷举法很难找出旅行商问题的正确解,
旅行商问题的一个平凡解法是找出图G的所有哈密尔顿回路计算它们的权重,然后比较它们的权重,权重最小的就是商人的最优路线
然而,理论上可以证明,旅行商问题是NPC问题,用枚举法求具有n个顶点的完全图K,的旅行商问题的最优解的算法复杂程度大约是
O
(
n
!
)
O(n!)
O(n!)。
因此,针对实际的旅行商问题,通常采用近似求解的策略:
最近邻居法
最短距离法
基于最小生成树的算法
奇点的最小代价完美匹配
Christofides算法
启发式算法
智能优化算法
旅行商问题的数学规划模型
m
i
n
∑
i
≠
j
d
i
j
x
i
j
min\sum_{i\ne j}d_{ij}x_{ij}
mini=j∑dijxij
s
.
t
.
∑
j
=
1
n
x
i
j
=
1
,
i
=
1
,
2
,
…
,
n
s.t.\quad \sum_{j=1}^{n}x_{ij}=1,\ i=1,2,\dots,n
s.t.j=1∑nxij=1, i=1,2,…,n
每个点只有一条边出去
∑
i
=
1
n
x
i
j
=
1
,
j
=
1
,
2
,
…
,
n
\sum_{i=1}^{n}x_{ij}=1,\ j=1,2,\dots,n
i=1∑nxij=1, j=1,2,…,n
每个点只有一条边进去
∑
i
,
j
∈
S
x
i
j
≤
∣
S
∣
−
1
,
2
≤
∣
S
∣
≤
n
−
1
,
S
⊂
{
1
,
2
,
…
,
n
}
\sum_{i,j\in S}x_{ij}\le | S|-1,\ 2\le | S|\le n-1,\ S \subset \left\{ 1,2,\dots,n \right\}
i,j∈S∑xij≤∣S∣−1, 2≤∣S∣≤n−1, S⊂{1,2,…,n}
除起点和终点外,各边不构成圈
x
i
j
∈
{
0
,
1
}
,
i
,
j
=
1
,
2
,
…
,
n
i
≠
j
x_{ij}\in \left\{ 0,1 \right\},\quad i,j=1,2,\dots,n\quad i\ne j
xij∈{0,1},i,j=1,2,…,ni=j
其中
∣
S
∣
| S|
∣S∣表示集合S种元素的个数
实际编程中上面的条件很难实现,因此实际上一般用下面的条件来确保除起点和终点外,各边不构成圈。
为每个城市规定一个访问顺序的编号
u
[
i
]
u[i]
u[i]变量。
u
[
i
]
=
k
u[i]=k
u[i]=k表示该城市是第
k
k
k个被访问的城市。规定
u
[
1
]
=
0
u[1]=0
u[1]=0,任意
u
[
i
]
<
=
n
一
1
u[i]<=n一1
u[i]<=n一1。显然如果
x
[
i
]
[
j
]
=
1
x[i][j]=1
x[i][j]=1,即道路i,j被选定在循环路径中,则
u
[
j
]
>
=
u
[
i
]
+
1
u[j]>=u[i]+1
u[j]>=u[i]+1。用以下约束表达这个逻辑:
u
[
j
]
>
=
u
[
i
]
+
1
−
n
(
1
−
x
[
i
]
[
j
]
)
,
i
=
1
,
…
,
n
;
j
=
2
,
.
,
n
;
i
不等于
j
u[j]>=u[i]+1-n(1-x[i][j]),i=1,\dots,n;j=2,.,n;i不等于j
u[j]>=u[i]+1−n(1−x[i][j]),i=1,…,n;j=2,.,n;i不等于j
上式中,如果
x
[
i
]
[
j
]
=
1
x[i][j]=1
x[i][j]=1,则等价于
u
[
j
]
>
=
u
[
i
]
+
1
u[j]>=u[i]+1
u[j]>=u[i]+1。如果
x
[
i
]
[
j
]
=
0
x[i][j]=0
x[i][j]=0,则右端小于等于0,恒小于等于左端,相当于该约束不存在。
TSP问题的求解
近似求解(最近邻居法):
从杭州出发,选离它最近的城市作为下一个目标城市-上海;
从上海出发,选离它最近的城市作为下一个目标城市-南京;
从南京出发,选离它最近的城市作为下一个目标城市-合肥
%1-上海2-杭州3-南京4-合肥
clear
cityName = ["上海","杭州","南京","合肥"];
D = [inf 173 299 466; 174 inf 290 420; 306 280 inf 170; 467 430 171 inf]; %距离矩阵
nCity = size(D, 1);
cityNo = 2; %从杭州出发,当前城市为杭州
total = 0;
path = zeros(nCity, 1);
[total path] = nearestNeighborTSP(cityNo,D);
fprintf('最近邻居法求解TSP问题:n路径为:');
for i = 1 : nCity - 1
fprintf(cityName(path(i)));
fprintf('->');
end
fprintf(cityName(nCity));
formatSpec = '\n 总里程为:%4.0f公里\n'; fprintf(formatSpec, total);
最近邻居法求解TSP问题:
路径为:杭州->上海->南京->合肥
总里程为:643公里
旅行商问题应用
碎纸片的拼接复原
问题1:
对于给定的来自同一页印刷文字文件的碎纸机破碎纸片(仅纵切),建立碎纸片拼接复原模型和算法,并针对附件1、附件2给出的中英文各一页文件的碎片数据进行拼接复原。
如果复原过程需要人工干预,请写出干预方式及干预的时间节点。复原结果以图片形式及表格形式表达(见【结果表达格式说明】)。
若将每个碎纸看成一个点,我们可以根据碎纸之间的吻合度定义两张碎纸之间的距离,可以看出,两张碎纸如果吻合度低,那对应的距离也大,所以寻找吻合率最高的组合方式,实质就是寻找总距离最小的路径,也就是寻找一条最佳TSP路径
基于识别序列的定义,定义碎纸A到碎纸B的距离模型为
{
d
A
→
B
=
∑
i
=
1
n
(
L
i
+
R
i
−
C
X
i
)
2
X
i
=
0
或
1
\left\{\begin{matrix} d_{A\to B}=\sum_{i=1}^{n}(L_{i}+R_{i}-CX_{i})^{2} \\ X_{i}=0或1 \end{matrix}\right.
{dA→B=∑i=1n(Li+Ri−CXi)2Xi=0或1
式中,
d
A
→
B
d_{A\to B}
dA→B为碎纸A到碎纸B的距离
L
i
L_{i}
Li:为碎纸B的左识别序列
R
i
R_{i}
Ri为碎纸A的右识别序列
C为字符的宽度
X
i
X_{i}
Xi为表示序列L或R的第i位是否都有字符,是则为1
n为序列长度
由距离的定义公式可以看出,两个识别序列的吻合程度越大,识别序列的距离越小,理想状况下,当两个识别序列完全吻合时,距离为 0(实际情况中,由于二值化,损失了部分精度,所以不会为0)
将碎纸复原抽象成复原TSP问题:用距离定义为权值,构造一个完全图
K
19
K_{19}
K19 然后求这个完全图里面的TSP路径
m
i
n
D
=
∑
i
=
1
18
d
p
i
→
p
i
+
1
min\ D=\sum_{i=1}^{18}d_{p_{i}\to p_{i+1}}
min D=i=1∑18dpi→pi+1
s
.
t
.
{
d
A
→
B
=
∑
i
=
1
n
(
L
i
+
R
i
−
C
X
i
)
2
{
p
1
.
p
2
,
…
,
p
19
}
是
{
1
,
2
,
…
,
19
}
的一个排列
,
X
i
=
0
或
1
s.t.\left\{\begin{matrix} d_{A\to B}=\sum_{i=1}^{n}(L_{i}+R_{i}-CX_{i})^{2} \\ \left\{ p_{1}.p_{2},\dots,p_{19} \right\}是\left\{ 1,2,\dots,19 \right\}的一个排列,\ X_{i}=0或1 \end{matrix}\right.
s.t.{dA→B=∑i=1n(Li+Ri−CXi)2{p1.p2,…,p19}是{1,2,…,19}的一个排列, Xi=0或1
D为TSP路径的总距离,
d
p
i
→
p
i
+
1
d_{p_{i}\to p_{i+1}}
dpi→pi+1为碎纸
p
i
p_{i}
pi到碎纸
p
i
+
1
p_{i+1}
pi+1的距离:
d
A
→
B
d_{A\to B}
dA→B为碎纸A到碎纸B的距离,其中A,B∈{1,2,…,19}
通过求解复原TSP问题,可以得到每个点的访问顺序,即碎纸片的拼接序
列,最后利用MATLAB图像拼接,得到复原了的纸片
一维碎纸复原算法步骤:
- 提取出碎纸图像的像素矩阵,并进行二值化处理;
- 提取出二值化处理后碎纸图像的文字特征
- 利用步骤二的文字特征构造识别序列,并转化为TSP问题
- 步骤四:利用模拟退火法求解TSP问题
注:19!=121645100408832000,这是一个18位数,假设每毫秒验证一种方案,穷举法大概需要385万年。