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

相关文章

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2