通过MindOpt APL建模求解组合优化问题中的常见问题:图着色问题

组合优化问题:图着色问题

通过MindOpt APL建模求解组合优化问题中的常见问题:图着色问题


1. 背景知识

1.1. 组合优化问题

在之前发布的《组合优化问题:装箱问题》中,我们讲解了什么是组合优化(Combinatorial Optimization,CO)。这里仅简述:

“组合”指的是从有限的对象集合中选择其中一部分元素作为解的过程,而“优化”则指的是在满足一定条件下,使得设置好的目标函数值达到最大或最小。即:组合优化问题的解集合中的元素是有限个的,要做的事情是在有限的集合里面找到使得目标取值最优的元素集合。实际情况中有很多问题是组合优化问题。组合优化问题大都是NP-hard问题,求解耗时很长,因此求解该问题的方法一直是被关注较多的研究方向。

本文将以一个简化的图着色问题(Graph Coloring Problem, GCP)为例,来讲解如何采用数学规划的方法来解决图着色问题这类组合优化问题。

1.2. 图着色问题

图着色问题旨在解决:在满足约束的情况下为图中的顶点或边分配颜色或标签,使得所用颜色/标签数最小的一类问题,主要分为顶点着色问题(Vertex Coloring)和边着色问题(Edge Coloring)两类。一般情况下,边着色问题可转化为顶点着色问题。之后我们以顶点着色问题为例进行建模求解,以下简称为着色问题。

最常见的顶点着色问题可被描述为:给定一个无向图G=(V, E),其中V表示的是顶点集合,E表示的是图中边的集合。目标是在满足图中相邻顶点颜色各不相同情况下,使得使用颜色的总种类数最小。其中,将顶点染色所使用的最少颜色种类数被称为着色数目(Chromatic Number)。

在这里插入图片描述

1.3. 应用场景

图着色问题作为一类经典优化问题,应用场景广泛,涵盖了多个领域的应用场景。如:

  • 人员排班:用最少的员工,执行冲突任务。
  • 仓储库存:用最少的位置,存储冲突物品。
  • 物流运输:用最少的车辆,运输冲突物品。
  • 教育/医疗:时间制表,用最少的时间段让选择多门课程的学生完成考试。
  • 无线通信:将最少的频率给位置临近的通信网络设备分配不同波长。
  • 代码编译:寄存器分配,用最少的寄存器完成冲突变量存储。

应用举例:以人员排班为例,考虑员工要执行的任务彼此之间涉及到冲突资源,如:

1)时间资源冲突:两个任务同一员工执行会存在时间段重叠;
2)人员资源冲突:两个任务执行需要用到同类型的员工;
3)工具资源冲突:两个任务执行需要用到同类型的工具。

彼此存在冲突的任务可视为相邻的顶点,不可用同一种人员执行,即不可染上相同的颜色。该类优化问题可视为,在符合资源冲突约束、颜色唯一性约束等情况下,寻找一类排班方式使得人员的使用量最小化。现实中的典型例子为飞机排班,不同的航班之间存在时间资源冲突,需要用最少的飞机数量完成所有航班的排班。

2. 数据示例

着色问题需要输入的数据主要包括无向图数据和颜色数据,其中无向图数据被存储在[vertex.csv]与[edge.csv]中,颜色数据被存储在[color.csv]中。

在[vertex.csv]中存储了图中顶点数据,主要包括了顶点的序号和名称,分别用字段"index"和"name"进行表示,数据内容如下所示。

indexname
1v1
2v2
3v3
…………
10v10

在[edge.csv]中存储了图中边相关的数据,主要包括了边所对应的起始节点和终止节点序号信息,分别用字段"start_idx"和"end_idx"进行表示,数据内容如下所示。

start_idxend_idx
12
13
14
…………
910

color.csv中存储了颜色相关的数据,主要包括了颜色的序号和名称,分别用字段"color_idx"和"color_name"进行表示,数据内容如下所示。

color_idxcolor_name
1green
2yellow
3bule
…………
10brown

3. 着色问题的数学建模

下面我们构建整数规划模型来建模求解着色问题,分别定义决策变量、约束与目标函数对该类问题进行求解。

具体的集合、参数与决策变量定义如下所示。

符号含义
C C C颜色集合,用 i n d e x   c ∈ C index \ c \in C index cC表示;
V V V无向图顶点集合,用 i n d e x   i , j ∈ V index \ i, j\in V index i,jV表示;
E E E无向图边集合,用 i n d e x   ( i , j ) ∈ E index \ (i, j) \in E index (i,j)E表示;
Δ \Delta Δ参数,表示无向图的最大度(maximum degree)。
决策变量含义
X i c X_{ic} Xic0-1变量,当顶点 i i i被染为颜色 c c c时取值为1;否则,取之为0。
C m a x C_{max} Cmax整数变量,含义为无向图染色所使用颜色种类数。

数学模型如下所示

目标函数:

  • 颜色种类:最小化染色所用颜色种类数。

M i n i m i z e Z = C m a x Minimize \quad Z = C_{max} MinimizeZ=Cmax

约束:

  • 颜色唯一性:无向图的每个顶点只能被染为一种颜色。

∑ c ∈ C X i c = 1 ∀ i ∈ V \sum_{c \in C}X_{ic} =1 \quad \forall i \in V cCXic=1iV

  • 相邻顶点颜色不相同:无向图中有边相连的相邻顶点之间颜色不相同。

X i c + X j c ≤ 1 ∀ c ∈ C ,   ( i , j ) ∈ E X_{ic} + X_{jc} \leq 1 \quad \forall c \in C, \ (i, j) \in E Xic+Xjc1cC, (i,j)E

  • 颜色总种类数计算:计算总共被使用的颜色种类数,即计算被使用的最大颜色下标。

C m a x ≥ ∑ c ∈ C c × X i c ∀ i ∈ V < / c e n t e r > C_{max} \geq \sum_{c \in C}{c \times X_{ic}} \quad \forall i \in V</center> CmaxcCc×XiciV</center>

注:根据Brook’s Theorem(1941)可知无向图的着色数目的上界为 Δ + 1 \Delta + 1 Δ+1,可在计算前对数据中颜色种类数进行检验或减少,可减小问题规模。在后续代码中会判断数据中的颜色种类数是否大于上界。

4. MindOpt APL建模和求解

MindOpt APL是一款代数建模语言,它可以方便地将LaTeX公式描述成程序对应修改,适合在模型研发期间使用。同时,它还可以调用多种求解器求解,方便更换求解器。详细的使用说明见用户手册MAPL用户手册链接。下面,我们通过MindOpt APL对该问题进行建模求解。


clear model;
option modelname GraphColoring01;

# Read Data
print "Read Data--------------";
param inputDir = "Data/";

# Vertex Data
param VertexFilename = "vertex.csv";
set V = {read inputDir+VertexFilename as "<1n>" skip 1};
param Vname[V] = read inputDir+VertexFilename as '<1n>2s' skip 1;

# Edge Data
param EdgeFilename = "edge.csv";
set E = {read inputDir+EdgeFilename as '<1n, 2n>' skip 1};
set EdgeByvertex[i in V] = {j in V with <i, j> in E or <j, i> in E:j};

# Color Data
param ColorFilename = "color.csv";
set C = {read inputDir+ColorFilename as "<1n>" skip 1};
param Cname[C] = read inputDir+ColorFilename as '<1n>2s' skip 1;

# Calculate MAX Degree
print  "Cal MAX Degree--------------";
param CountMaxdegree = 0;
forall {i in V}:
    CountMaxdegree = if card(EdgeByvertex[i]) > CountMaxdegree then card(EdgeByvertex[i]) else CountMaxdegree end;
set C1 = if card(C) > CountMaxdegree+1 then {1..CountMaxdegree+1} else C end;
print "Max Degree is", CountMaxdegree;

# Build Model to Solve the Problem
# Add Vars
var X[V*C1] binary;
var Cmax integer >= 0 <= CountMaxdegree+1;

# Set Objective Function
minimize ColorNumber: Cmax;

# Constr 1
subto ColorOnlyConstr:
    forall {i in V} sum{c in C1} X[i, c] == 1;

# Constr 2
subto AdjacentConstr:
    forall {c in C1}:
        forall {<i, j> in E}:
            X[i, c] + X[j, c] <= 1;

# Constr 3
subto CalCmaxConstr:
    forall {i in V}:
        Cmax >= sum{c in C1} c * X[i, c];

# Solve the Model
print  "Solve the Model--------------";
option solver mindopt;     # Use MindOpt to Solve the Model
#option mindopt_options 'max_time=600'; # Set Param
#option mindopt_options 'print=0'; # Set Output log Param
solve;         

# Output
print "Print Result--------------";
# display;

print "-Min Color Number is ", Cmax;

forall {<i, c> in V*C1}:
    if X[i, c] >= 0.5 then print "Vertex ",Vname[i]," Color is ",Cname[c];


param OutputFilename = "Result/Result_for_GCP.csv";
print "Vertex Name,Color": "Result/Result_for_GCP.csv";
forall {<i, c> in V*C1}:
    if X[i, c] >= 0.5 then print "{},{}"%Vname[i],Cname[c]>> "Result/Result_for_GCP.csv";
close "Result/Result_for_GCP.csv";

print "Path for Result file is [{}]({})"%OutputFilename, OutputFilename;

运行结果如下:

Read Data--------------
Cal MAX Degree--------------
Max Degree is6
Solve the Model--------------
Running mindoptampl
wantsol=1
MindOpt Version 1.3.0 (Build date: 20240723)
Copyright (c) 2020-2024 Alibaba Cloud.

Start license validation (current time : 30-JUL-2024 16:25:20).
License validation terminated. Time : 0.003s

Model summary.
 - Num. variables     : 71
 - Num. constraints   : 167
 - Num. nonzeros      : 444
 - Num. integer vars. : 71
 - Bound range        : [1.0e+00,7.0e+00]
 - Objective range    : [1.0e+00,1.0e+00]

Branch-and-cut method started.
Original model: rows = 167 columns = 71 nonzeros = 444
Tolerance: primal = 1e-06 int = 1e-06 mipgap = 0.0001 mipgapAbs = 1e-06
Limit: time = 1.79769313486232e+308 node = -1 stalling = -1 solution = -1
presolver terminated; took 0 ms
presolver terminated; took 7 ms
Parallelism: root=2, tree=2
Model summary.
 - Num. variables     : 71
 - Num. constraints   : 76
 - Num. nonzeros      : 311
 - Bound range        : [1.0e+00,7.0e+00]
 - Objective range    : [1.0e+00,1.0e+00]
 - Matrix range       : [1.0e+00,7.0e+00]

Presolver started.
Presolver terminated. Time : 0.001s

Simplex method started.
Model fingerprint: =Y2dmZGZ3ZGY3FGY

    Iteration       Objective       Dual Inf.     Primal Inf.     Time
            0     0.00000e+00      0.0000e+00      1.0000e+01     0.00s    
           75     3.00000e+00      0.0000e+00      0.0000e+00     0.01s    
Postsolver started.
Simplex method terminated. Time : 0.005s

Root relaxation: 3 iteration = 75 time = 0.005

Evaluated  InQueue     DualBound     Incumbent      Gap      Time
        0        0    3.00000000    5.00000000   40.00%        0s
        0        0    3.00000000    5.00000000   40.00%        0s
Branch-and-cut method terminated. Time : 0.207s


OPTIMAL; objective 5.00

Completed.
Print Result--------------
-Min Color Number is 5
Vertex v1 Color is green
Vertex v2 Color is yellow
Vertex v3 Color is yellow
Vertex v4 Color is bule
Vertex v5 Color is green
Vertex v6 Color is black
Vertex v7 Color is red
Vertex v8 Color is yellow
Vertex v9 Color is green
Vertex v10 Color is bule
Path for Result file is [Result/Result_for_GCP.csv](Result/Result_for_GCP.csv)

5. 运行结果

该程序求解后的结果文件存储在Result文件夹中,被存储在[Result_for_GCP.csv],具体数据所示如下:

Vertex NameColor
v1green
v2yellow
v3yellow
…………
v10bule

得到的具体结果为

顶点v1染色为green
顶点v2染色为yellow
顶点v3染色为yellow
顶点v4染色为bule
顶点v5染色为green
顶点v6染色为black
顶点v7染色为red
顶点v8染色为yellow
顶点v9染色为green
顶点v10染色为bule

所使用的颜色总数为5种,具体情况如下图所示。

在这里插入图片描述

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值