通过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

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

Springboot如何正确使用AOP问题

《Springboot如何正确使用AOP问题》:本文主要介绍Springboot如何正确使用AOP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录​一、AOP概念二、切点表达式​execution表达式案例三、AOP通知四、springboot中使用AOP导出

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

IDEA Maven提示:未解析的依赖项的问题及解决

《IDEAMaven提示:未解析的依赖项的问题及解决》:本文主要介绍IDEAMaven提示:未解析的依赖项的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录IDEA Maven提示:未解析的依编程赖项例如总结IDEA Maven提示:未解析的依赖项例如

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模