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

相关文章

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX