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

2024-08-30 16:36

本文主要是介绍通过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.003sModel 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.001sSimplex method started.
Model fingerprint: =Y2dmZGZ3ZGY3FGYIteration       Objective       Dual Inf.     Primal Inf.     Time0     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.005sRoot relaxation: 3 iteration = 75 time = 0.005Evaluated  InQueue     DualBound     Incumbent      Gap      Time0        0    3.00000000    5.00000000   40.00%        0s0        0    3.00000000    5.00000000   40.00%        0s
Branch-and-cut method terminated. Time : 0.207sOPTIMAL; objective 5.00Completed.
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种,具体情况如下图所示。

在这里插入图片描述

这篇关于通过MindOpt APL建模求解组合优化问题中的常见问题:图着色问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121354

相关文章

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Mysql如何解决死锁问题

《Mysql如何解决死锁问题》:本文主要介绍Mysql如何解决死锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录【一】mysql中锁分类和加锁情况【1】按锁的粒度分类全局锁表级锁行级锁【2】按锁的模式分类【二】加锁方式的影响因素【三】Mysql的死锁情况【1

SpringBoot内嵌Tomcat临时目录问题及解决

《SpringBoot内嵌Tomcat临时目录问题及解决》:本文主要介绍SpringBoot内嵌Tomcat临时目录问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录SprinjavascriptgBoot内嵌Tomcat临时目录问题1.背景2.方案3.代码中配置t

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分