【图论】着色问题
文章目录
着色问题:
已知图 G = ( V , E ) G=(V,E) G=(V,E),对图 G G G的所有顶点进行着色时,要求相邻的两顶点的颜色不一样。
常用于分配问题,需要享用共同资源的顶点用一条边连起来;药品存储问题,相斥的药品用同一条边连起来
定理:
若图 G = ( V , E ) G=(V,E) G=(V,E), Δ = m a x { d ( v ) ∣ v ∈ V } \Delta=max\{d(v)|v\in V\} Δ=max{d(v)∣v∈V} 为图顶点的最大度数,则着色所需要的最少颜色数目 X ( G ) < Δ + 1 X(G)<\Delta+1 X(G)<Δ+1
例题
会议安排。学校的学生会下设6个部门,部门的成员如下:部门1 = {张,李,王},部门2 = {李,赵,刘},部门3 = {张,刘,王},部门4 = {赵,刘,孙},部门5 = {张,王,孙},部门6 = {李,刘,王}. 每个月每个部门都要开一次会为了确保每个人都能参加他所在部门的会议,这6个会议至少需要安排在几个不同的时段?
线性规划模型:
图中顶点个数 n = 6 n=6 n=6,顶点的最大度 Δ = 5 \Delta=5 Δ=5。引入0-1变量
x
i
k
=
{
1
,
当
v
i
为第
k
种颜色时,
0
,
否则,
x_{i k}=\left\{\begin{array}{ll} 1, & \text { 当 } v_{i} \text { 为第 } k \text { 种颜色时, } \\ 0, & \text { 否则, } \end{array}\right.
xik={1,0, 当 vi 为第 k 种颜色时, 否则,
i
=
1
,
2
,
…
n
;
k
=
1
,
2
,
…
,
Δ
+
1
i=1,2,…n;\quad k=1,2,…,\Delta + 1
i=1,2,…n;k=1,2,…,Δ+1
设颜色总数为 y y 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. \begin{array}{l} \min y, \\ \text { s. t. }\left\{\begin{array}{ll} \sum_{k=1}^{\Delta+1} x_{i k}=1, & i=1,2, \cdots, n, \\ x_{i k}+x_{j k} \leqslant 1, & \left(v_{i}, v_{j}\right) \in E, k=1,2, \cdots, \Delta+1, \\ y \geqslant \sum_{k=1}^{\Delta+1} k x_{i k}, & i=1,2, \cdots, n, \\ x_{i k}=0 \text { 或 } 1, & i=1,2, \cdots, n, k=1,2, \cdots, \Delta+1 . \end{array}\right. \end{array} miny, s. t. ⎩ ⎨ ⎧∑k=1Δ+1xik=1,xik+xjk⩽1,y⩾∑k=1Δ+1kxik,xik=0 或 1,i=1,2,⋯,n,(vi,vj)∈E,k=1,2,⋯,Δ+1,i=1,2,⋯,n,i=1,2,⋯,n,k=1,2,⋯,Δ+1.
min y \min y miny 表示限制颜色总数最少
第一个限制条件表示一个点最多只能染一种颜色
第二个限制条件表示一条边两端的点颜色不同
第三个限条件表示染色数的不等条件
第四歌限制条件表示一个点要不染了一种颜色,要不没有染色
s={{'张','李','王'};{'李','赵','刘'};{'张','刘','王'};{'赵','刘','孙'};{'张','王','孙'};{'李','刘','王'}};
n=length(s);
w=zeros(n); % 一个n*n的邻接矩阵
for i = 1:n-1
for j = i+1:n
if ~isempty(intersect(s{i},s{j})) % 如果这两个集合有交集的话
w(i,j)=1; % 两个顶点的邻接矩阵的值设为1
end
end
end
[ni,nj]=find(w); % 返回矩阵非0元素的行号和列号,即顶点的编号
w=w+w'; % 因为是无向图,需要计算完整的邻接矩阵
deg=sum(w);K=max(deg); % 顶点的最大度
prob=optimproblem; % 创建优化问题
x=optimvar('x',n,K+1,'Type','integer','LowerBound',0,'UpperBound',1); % 优化变量x,第一个‘x’里面是变量名,后面说的是该变量所包含的行数和列数
y=optimvar('y'); % 优化变量y
prob.Objective=y; % 优化的结果
prob.Constraints.con1=sum(x,2)==1; % 限制条件1
prob.Constraints.con2=x(ni,:)+x(nj,:)<=1; % 限制条件2
prob.Constraints.con3=x*[1:K+1]'<=y; % 限制条件3
[sol,fval,flag,out]=solve(prob); % sol:包含了解决问题的x值和y值
[i,k]=find(sol.x);
fprintf('顶点和颜色的对应关系如下:\n')
ik=[i';k'];