列生成(column generation)的应用问题

2024-04-21 20:08

本文主要是介绍列生成(column generation)的应用问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

当我们讨论列生成算法,一定要了解一个经典问题——木材下料问题(The cutting stock problem),最初问题的形式为线性规划,相关的问题解析有很多:

优化 | 从集合划分问题到列生成算法

单纯形法和列生成算法解释

线性规划技巧: 列生成(Column Generation)

列生成算法求解矩形下料问题(Matlab代码)

列生成和分支定价

从木材下料问题向外拓展,列生成算法也被用于大规模的线性规划问题,这些问题有以下特征:

  • 大规模意味着变量特别多,很难一次性完全的考虑进来;
  • 只有一小部分变量值是非零的(基变量),大部分变量值为零(非基变量);
  • 只有部分变量可以改善目标函数。

这篇文章主要想把重心放在,当应用列生成算法时会遇到的一些问题及可能的解决方案。

抽象来说,列生成的思路是在子区域(只包含部分列)先生成一个MVP(也就是可行但不是最优的策略),再去寻找可能减少差额成本/非基变量检验数(reduced cost)的列,可行的话就将这个列加入原本的策略中(微调策略)并更新所有列的cost,继续迭代寻找,直到找到最优的策略。

具体来说,在确定要解决的主问题(MP)之后,需要进行几个关键步骤:

  1. 分解问题(Master Problem,MP)为限制主问题(Restricted Master Problem,RMP)与估价问题/子问题(Pricing Problem,PP);
  2. 在每次迭代中,PP通过reduce cost(dual cost)来判断是否有RMP中未涉及到的列(column/independent set)可以改善整个策略。
  3. 如果有则将这个列与cost一同加入当前的RMP,重新计算cost。
  4. 一直迭代到目标函数接近最优。

所以,这个过程中将会涉及到很多个具体问题:

  • 如何拆分原主问题(MP)?
  • 列如何定义?
  • reduce cost如何定义?
  • 最开始的子区域是如何选择的?
  • 如何迭代求解最优的策略?
  • 如何判断其接近最优?

而且,即使是这样的整数线性规划问题,随着问题规模的增大,求解的时间也会是难以接受的。如何尽量减少求解的时间?

实际生活中,遇到的问题也并不如木材下料问题那么规整,可能伴随着大量显式或隐式的constraint,我们又如何处理它们?

如何拆分原主问题(MP)?列如何定义?

这两个问题几乎是等价的,当你确定了列的定义,也就知道如何拆分主问题了,因为所求的RMP形式上一般都满足求某个子区域内的向量的线性组合,这个向量一般就是列生成算法中所说的“列”。

所以列可以理解为是最终策略的一个元素,而最终策略,需要集合多种不同的元素达到最优化。换言之,如果最终想要得到的方案一般是一个整体的优化方案,比如最大流问题,路径规划问题等。

有些情况下,列的定义可以是与时间t相关的函数,这种方法比较取巧。

有些问题的拆分是逻辑上自然而然的,因为很容易找到有现成求解办法又使问题规模变小的RMP。比如在木材下料问题中,主问题是最小化切割方案的cost,cost被定义为浪费的木材长度。一条固定长度的木材的切割方案自然地可以通过穷举来得到。所以MP被转化为了选择切割方案的线性组合,这是典型的线性规划问题。切割方案也就是列,组合的weight自然与cost(所浪费的木材长度)所挂钩。

但在一些问题上,RMP和PP的定义是相当困难的。不一定一开始就能找到所有的方案再从中寻找,而是需要特殊的Price model去限制。

reduce cost如何定义?

通常,想要找到这个reduce cost要通过对偶理论来实现。

找到reduce cost之后就可以定义Price model。当然也有特殊结构的price model,个人认为这是整个算法中最难定义的一部分。具体怎么实现,目前还没有完全参透,先留一个坑,之后来填。

最开始的子区域是如何选择的?

在大部分情况下,最初的区域(initial set)是不会影响最终的优化结果,但它在一定程度上会影响整个算法收敛的速度。

如果最初的区域很小很简单,算法在一开始的迭代过程中将很容易提升,lower bound与upper bound的gap将很快缩小。

如何迭代求解最优的策略?

不停地向RMP加入新的列,再求解RMP。

其中,求解RMP的方法可以是任何算法,只要可以找到reduce cost为负的可行解就行。一般建模为哪类问题,就用哪类问题的常规解法即可。

但是,也存在退化现象,也就是说原问题的对偶问题的对偶最优解不是唯一的,找到的列往往不能改善目标函数值。减少退化现象的影响之一就是不使用对偶问题的基解而是使用对偶问题定义域中的内点解。

可以考虑一次加很多列减弱退化,不需要每次都求到最小的reduce cost,除了动态规划方法,·也可以涉及启发式的规则去解,只要保证负的就行。

如何判断其接近最优?

直到子问题的解全部为非负,则为整体收敛了。

但很多情况下,由于问题规模太大,当迭代到非负时,已经耗费了大量的时间与计算资源了。此时,可以用各种bounded算法去限制计算的精度,常用的有\epsilon-bounded。

 

 

这篇关于列生成(column generation)的应用问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库