【图论】着色问题

【图论】着色问题


着色问题:

已知图 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)vV} 为图顶点的最大度数,则着色所需要的最少颜色数目 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+xjk1,yk=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'];    
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我胡萝北

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值