运筹学基础(六)列生成算法(Column generation)
文章目录
- 前言
- 从Cutting stock problem说起
- 常规建模
- Column generation reformulation
- 列生成法
- 核心思想
- 相关概念
- Master Problem (MP)
- Linear Master Problem (LMP)
- Restricted Linear Master Problem (RLMP)
- subproblem(核能预警,非常重要)
- 算法流程图
- CG求解cutting stock problem
- 适用场景:large linear programming
- 参考资料
前言
学习列生成之前,有一些前置基础需要理解,不然就没法继续往下学了。所以为了写这篇文章,我提前铺垫了3篇文章帮助自己把基础捡起来!
- 单纯形法:运筹学基础(一)求解线性规划的单纯形法详解
- 检验数:运筹学基础(四):单纯形法中检验数(reduced cost)的理解
- 对偶问题:运筹学基础(五):对偶问题及其性质
今天终于可以进入正题了!
从Cutting stock problem说起
有一堆固定长度的钢管,不同的顾客想要长度不一样的钢管若干,怎么切割钢管能够使得消耗的钢管数最少?
常规建模
【集合】
- K K K:未切割的钢管集合;
- I I I:所需钢管的种类集合;
【参数】
- D i D_i Di:第 i i i种钢管的需求数量;
- L k L_k Lk:第 k k k根未切钢管的长度;
- L i L_i Li:第 i i i种钢管的长度;
【决策变量】
- x k i x_{ki} xki:第 k k k根钢管切割第 i i i种长度的数量;
- y k y_k yk:第 k k k根钢管是否使用;
【数学模型】
目标函数:最小化使用的钢管数量
约束条件:
- 每根钢管被切割的总长度,不多于该根钢管的总长度;
- 每种钢管被切割的数量不低于该种钢管的总需求量;
m i n ∑ k ∈ K y k s . t . ∑ i ∈ I x k i L i ≤ L k ∗ y k , ∀ k ∈ K ∑ k ∈ K x k i ≥ D i , ∀ i ∈ I x k i ∈ { 0 , 1 } , ∀ k ∈ K , i ∈ I y k ∈ { 0 , 1 } , ∀ k ∈ K min \quad \sum_{k\in K}y_k\\ s.t. \sum_{i\in I}x_{ki}L_i\leq L_k*y_k, \forall k \in K\\ \sum_{k\in K}x_{ki} \geq D_i, \forall i \in I\\ x_{ki} \in \{0, 1\}, \forall k\in K, i\in I\\ y_{k} \in \{0, 1\}, \forall k\in K mink∈K∑yks.t.i∈I∑xkiLi≤Lk∗yk,∀k∈Kk∈K∑xki≥Di,∀i∈Ixki∈{0,1},∀k∈K,i∈Iyk∈{0,1},∀k∈K
问题:该建模方式求解不高效(怎么理解
),因此有人想出了第二种建模思路。
Column generation reformulation
假设所有的切割方式已知,我们用:
- P P P表示所有的切割方案集合;
- C p i C_{pi} Cpi表示在第 p p p种切割方式下,能切割出的第 i i i种钢管的数量;
定义新的决策变量:
- z p z_p zp:表示执行第 p p p种切割模式的钢管的数量。
数学模型表示如下:
m i n ∑ p ∈ P z p s . t . ∑ p ∈ P C p i z p ≥ D i , ∀ i ∈ I z p ≥ 0 , z p i s i n t e g e r , ∀ p ∈ P min \sum_{p\in P}z_p\\ s.t. \sum_{p\in P}C_{pi}z_p \geq D_i, \forall i \in I\\ z_p \geq 0, z_p \quad is \quad integer, \forall p\in P minp∈P∑zps.t.p∈P∑Cpizp≥Di,∀i∈Izp≥0,zpisinteger,∀p∈P
核心问题:切割模式非常多,穷举出来几乎是不可能的,也没有必要(因为不是所有的切割模式都会被用到)!那么如何去寻找最优的切割模式呢?
铛铛铛铛,列生成法正式登场!
列生成法
核心思想
列生成法本质上也是单纯形法的一种形式。常规的单纯形法要求可以把所有变量显式的表达出来,但是诸如cutting stock problem之类的问题,可能无法做到这一点,因此常规的单纯形法就束手无策了。
回想一下单纯形法的迭代过程,基变量的个数等于约束的个数,每次找一个非基变量入基(这个非基变量的增加,要能优化目标函数),直到不能改善目标函数值为止。可以发现,在这个过程中,并不是所有的变量都会用到!
因此有人想到:
- 可以先把原问题( P 0 P_0 P0)限制( r e s t r i c t restrict restrict)到一个规模很小的问题( P 1 P_1 P1)上,然后用单纯形法求解 P 1 P_1 P1。但此时求的最优解是 P 1 P_1 P1的最优解,不是原问题的最优解。
- 因此还需要一个子问题(subproblem)去检查是否存在一个非基变量,其reduced cost小于0(即改变量的增大可以进一步优化目标函数),如果存在,就把这个非基变量相关的系数列加入到 P 1 P_1 P1的系数矩阵中,回到第一步。直到找不到reduced cost小于0的非基变量,即找到了原问题的最优解。
为了获取更优的目标值,往往会选择reduced cost最小的非基变量(切割模式)加入到 P 1 P_1 P1中,那么如何寻找reduced cost最小的非基变量呢?
回答这个问题之前,有一些相关概念先快速弄清楚。
相关概念
Master Problem (MP)
对于一般问题而言,如果要用CG(column generation)求解,一般要转化成set covering model,类似于上面的cutting stock model。不是很理解为什么
转为称为set covering model的问题就称为MP,例如:
Linear Master Problem (LMP)
如果MP里存在整数变量,要先进行线性松弛,MP线性松弛以后的问题就是LMP。
Restricted Linear Master Problem (RLMP)
将LMP限制(restrict)到一个规模更小(即变量数量更少)的问题,就称为RLMP了。
可以看到,下式相比原来的linear master problem,restricted linear master problem相当于把 y k + 1 . . . y n y_{k+1}...y_{n} yk+1...yn强制限制为非基变量了。
subproblem(核能预警,非常重要)
subproblem就是帮助我们找到,当前是否还有非基变量加入 P 1 P_1 P1能够使得目标函数值进一步改善的。理解subproblem的前提是,弄清楚检验数和对偶变量之间的关系。
我们做一下推导:
假设我们找到了原问题的最优解 [ x B , 0 ] [x_B, 0] [xB,0],那么此时原问题的检验数一定都是大于等于0的,即:
C N T − C B T B − 1 N ≥ 0 C_N^T-C_B^TB^{-1}N \geq 0 CNT−CBTB−1N≥0
可以得到:
C N T ≥ C B T B − 1 N C_N^T \geq C_B^TB^{-1}N CNT≥CBTB−1N
我们计算一下:
C B T B − 1 A = C B T B − 1 [ B , N ] = [ C B T , C B T B − 1 N ] ≤ [ C B T , C N T ] = C T C_B^TB^{-1}A=\\ \quad\\ C_B^TB^{-1}[B, N]=\\ \quad\\ [C_B^T, C_B^TB^{-1}N]\leq\\ \quad\\ [C_B^T,C_N^T]=\\ \quad\\ C^T CBTB−1A=CBTB−1[B,N]=[CBT,CBTB−1N]≤[CBT,CNT]=CT
提炼一下上式推导过程中的首尾:
C B T B − 1 A ≤ C T C_B^TB^{-1}A \leq C^T CBTB−1A≤CT
观察一下对偶问题的约束条件:
y T A ≤ C T y^TA\leq C^T yTA≤CT
发现:
C B T B − 1 C_B^TB^{-1} CBTB−1
是对偶问题的一个可行解!
我们继续证明它不仅是一个可行解,而且是最优解:
令:
y T = C B T B − 1 y^T=C_B^TB^{-1} yT=CBTB−1
此时对偶问题的目标函数值为:
y T A = C B T B − 1 b = y^TA=C_B^TB^{-1}b= yTA=CBTB−1b=
这里有个转换是:
x B = B − 1 b x_B=B^{-1}b xB=B−1b
在我的文章运筹学基础(四):单纯形法中检验数(reduced cost)的理解里有相关推导。
因此:
y T A = C B T B − 1 b = C B T x B = C T x y^TA=C_B^TB^{-1}b=C_B^Tx_B=C^Tx yTA=CBTB−1b=CBTxB=CTx
根据对偶问题的最优性性质,可知 y T y^T yT为对偶问题的最优解。
于是检验数的表达式可以写成:
C N T − C B T B − 1 N = y T N C_N^T-C_B^TB^{-1}N = y^TN CNT−CBTB−1N=yTN
所谓的subproblem就是根据该公式,在 y k + 1 . . . y n y_{k+1}...y_{n} yk+1...yn中找到检验数为负,并且最小的非基变量,将变量对应的那一列添加到RLMP中。
算法流程图
CG求解cutting stock problem
题目如下:
第一步:求解RLMP的最优解
第二步:求解subproblem
c i c_i ci表示在新的这种切割模式下,切割第 i i i种钢管的数量。
23+27=20米,正好为钢管的总长度,符合条件。
第三步:加入新的切割模式到原来的模型中,继续求解
第四步:继续求解subproblem,无更好的切割模式,终止
适用场景:large linear programming
约束的数量有限,但是变量的数量非常多的大规模线性规划问题。例如:机组人员调度问题(Crew Assignment Problem)、切割问题(Cutting Stock Problem)、车辆路径问题(Vehicle Routing Problem)、单资源工厂选址问题(The single facility location problem )等。
参考资料
- 带你彻底了解Column Generation(列生成)算法的原理
- 大规模优化求解器-Gurobi-教程
相关文章:

运筹学基础(六)列生成算法(Column generation)
文章目录 前言从Cutting stock problem说起常规建模Column generation reformulation 列生成法核心思想相关概念Master Problem (MP)Linear Master Problem (LMP)Restricted Linear Master Problem (RLMP)subproblem(核能预警,非常重要) 算法…...
[阅读笔记] 电除尘器类细分市场2023年报
0.原始链接: 2023年除尘行业评述及2024年发展展望-北极星大气网 中国环保产业协会 供稿 1.重要信息摘录 市场占有率最大的是电除尘和袋式除尘行业装备产品名录: 国家鼓励发展的重大环保技术装备目录(2023年版)权威评审机构:…...
Kubernetes学习笔记11
k8s集群核心概念:pod: 在K8s集群中是不能直接运行容器的,K8s的最小调度单元是Pod,我们要使用Pod来运行应用程序。 学习目标: 了解pod概念: 了解查看pod方法 了解创建pod方法 了解pod访问方法 了解删除…...

✌2024/4/3—力扣—无重复字符的最长子串
代码实现: 解法一:暴力法 int lengthOfLongestSubstring(char *s) {int hash[256] {0};int num 0;for (int i 0; i < strlen(s); i) {int count 0;for (int j i; j < strlen(s); j) {if (hash[s[j]] 0) {hash[s[j]];count;num num > cou…...
Tauri 进阶使用与实践指南
Tauri 进阶使用与实践指南 调试技术 在 Tauri 应用开发中,调试分为两大部分:Web 端与 Rust 控制台。 Web 端调试 在 Web 端界面,可以直接采用浏览器内置的开发者工具进行调试。在 Windows 上,可以通过快捷键 Ctrl Shift i 打…...
2024年最新社交相亲系统源码下载
最新相亲系统源码功能介绍 参考:相亲系统源码及功能详细介绍 相亲系统主要功能 (已完成) 相亲系统登录注册 相亲系统会员列表 相亲系统会员搜索 相亲系统会员详情 相亲系统会员身份认证 - 对接阿里云 相亲系统资源存储 - 对接七…...

git知识
如何将develop分支合并到master分支 #简单版 git checkout master git pull origin master git merge origin/develop # 解决可能的冲突并提交 git push origin master#复杂版 git checkout master # 拉取远程 master 分支的最新代码并合并到本地 git pull origin master # 拉…...
代码随想录算法训练营第三十五天|860.柠檬水找零、406.根据身高重建队列、452.用最少数量的箭引爆气球
代码随想录算法训练营第三十五天|860.柠檬水找零、406.根据身高重建队列、452.用最少数量的箭引爆气球 860.柠檬水找零 在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯…...
golang defer实现
derfer : 延迟调用,函数结束返回时执行,多个defer按照先进后出的顺序调用 原理:底层通过链表实现,每次新增的defer调用,通过头插法插入链表;defer执行时,从链表头开始遍历,相当于实…...

数据仓库实践
什么是数据仓库? 数据仓库是一个用于存储大量数据并支持数据分析与报告的系统。它通常用于集成来自不同来源的数据,提供一个统一的视图,以便进行更深入的分析和决策。 数据仓库的主要优势? 决策支持:为企业决策提供可靠…...

深入浅出 -- 系统架构之微服务标准组件及职责
我们来认识一下微服务架构在Java体系中依托哪些组件实现的。 相对于单体架构的简单粗暴,微服务的核心是将应用打散,形成多个独立提供的微服务,虽然从管理与逻辑上更符合业务需要。但微服务架构也带来了很多急需解决的核心问题: 1…...

IP协议中的四大支柱:DHCP、NAT、ICMP和IGMP的功能剖析
DHCP动态获取 IP 地址 我们的电脑通常都是通过 DHCP 动态获取 IP 地址,大大省去了配 IP 信息繁琐的过程。 客户端首先发起 DHCP 发现报文(DHCP DISCOVER) 的 IP 数据报,由于客户端没有 IP 地址,也不知道 DHCP 服务器的…...

基于Socket简单的UDP网络程序
⭐小白苦学IT的博客主页 ⭐初学者必看:Linux操作系统入门 ⭐代码仓库:Linux代码仓库 ❤关注我一起讨论和学习Linux系统 1.前言 网络编程前言 网络编程是连接数字世界的桥梁,它让计算机之间能够交流信息,为我们的生活和工作带来便利…...
计算机思维
计算机思维是一种运用计算机科学的基础概念和方法来解决问题、设计系统和理解人类行为的思维方式。它包括以下几个方面: 1. 抽象和建模:将复杂的现实问题抽象为计算机可以处理的模型,通过定义对象、属性和关系来构建问题的逻辑结构。 2. 算法…...
如何判断一个linux机器是物理机还是虚拟机
https://blog.csdn.net/qq_32262243/article/details/132571117 第一种方式:dmesg命令 [rootnshqae01adm03 ~]# dmesg | grep -i hypervisor [ 0.000000] Hypervisor detected: Xen PV [ 1.115297] VPMU disabled by hypervisor. 在我的机器上 dmesg也是能够用来判…...
python用requests的post提交data数据以及json和字典的转换
环境:python3.8.10 python使用requests的post提交数据的时候,代码写法跟抓包的headers里面的Content-Type有关系。 (一)记录Content-Type: application/x-www-form-urlencoded的写法。 import requestsurlhttps://xxx.comheade…...
【Datax分库分表导数解决方法】MySQL_to_Hive
Datax-MySQL_to_Hive-分库分表-数据同步工具 简介: 本文档介绍了一个基于Python编写的工具,用于实现分库分表数据同步的功能。该工具利用了DataX作为数据同步的引擎,并通过Python动态生成配置文件,并调用DataX来执行数据同步任务…...

Vue2 —— 学习(一)
目录 一、了解 Vue (一)介绍 (二)Vue 特点 (三)Vue 网站 1.学习: 2.生态系统: 3.团队 二、搭建 Vue 开发环境 (一)安装与引入 Vue 1.直接引入 2.N…...

Windows Server 2008添加Web服务器(IIS)、WebDAV服务、网络负载均衡
一、Windows Server 2008添加Web服务器(IIS) (1)添加角色,搭建web服务器(IIS) (2)添加网站,关闭默认网页,添加默认文档 在客户端浏览器输入服务器…...
SpringMVC转发和重定向
转发和重定向 1. View Resolver Spring MVC 中的视图解析器(View Resolver)负责解析视图。可以通过在配置文件中定义一个 View Resolver 来配置视图解析器: 配置文件版:spring-web.xml <!-- for jsp --> <bean class&q…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

DAY 45 超大力王爱学Python
来自超大力王的友情提示:在用tensordoard的时候一定一定要用绝对位置,例如:tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾: tensorboard的发展历史和原理tens…...

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)
注:文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件:STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...
用鸿蒙HarmonyOS5实现国际象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码,使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...

【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space
问题:IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案:将编译的堆内存增加一点 位置:设置setting-》构建菜单build-》编译器Complier...