当前位置: 首页 > news >正文

混合整数规划(Mixed Integer Programming)

混合整数规划(Mixed Integer Programming)

混合整数规划问题是运筹优化中经常遇到的一类问题。在这类问题中自变量的类型可能是整数也可能不是整数。相比于连续优化,混合整数规划很多时候会更难求解。在学术界混合整数规划一直是一个活跃的研究领域。

Branch and Bound(分支定界法)

分支定界法是求解整数规划和混合整数规划类问题的一种经典算法。其中包含了分支(branch)和定界(bound)两个部分。分支部分作用是将问题分解为子问题,定界部分作用是寻找一个松弛过后的最优解,进而判断能否将某分支进行修剪。

我们以一个简单的背包问题为例:

在这里插入图片描述

我们需要在给定背包容量的约束下最大化背包里装的物品的价值。上面这个问题中有三种物品可以选择。对于物品而言,只有0和1两种选择。但假如我们要放入的是巧克力呢,那么我们就可以将大巧克力分成小巧克力使得背包恰好被装满。在这种情况下,我们需要将单位价值更高的巧克力先放到背包里,这样才能够保证包里装的东西价值最高。当物品是巧克力时,我们相当于将原本的整数变量进行了松弛,以达到最优。

我们也可以在混合整数规划中参照上面的思路,我们可以在定界的时候对原本限制为整数的变量松弛,得到松弛过后的最优解。实际的最优解是没有松弛过后的最优解好的,即松弛过后的最优解是实际的最优解的上界(在背包问题中,目标函数需要最大化)。假如在某一分支松弛过后的最优解仍然没有当前的最优好,代表这一分支可以被舍弃。经过松弛,我们可以更好地进行剪枝,加速分支定界法的算法执行。

Cutting Planes(割平面法)

割平面法也是在混合整数规划中经常会用到的方法,其中怎么割平面有很多种方法,在这里主要介绍Gomory cuts。在割平面法中,线性规划起到了很大的作用
在这里插入图片描述

假设有上述问题,我们首先对整数变量进行松弛。松弛过后原本的整数规划问题可以看作是一个线性规划问题。对于线性规划问题我们可以使用单纯形法这个经典的算法进行多项式时间内的求解(大部分情况)。对原问题进行松弛过后进行线性规划求解得到的解不一定为原问题的解,因为求出来的解可能不是整数。

在这里插入图片描述

这时我们需要对解空间进行切割,切割需要满足两个条件

  • 切割过后的解空间中不包含上一次线性规划求出来的解

  • 切割没有将可行解切割掉

切割过后继续使用线性松弛,重复上面的步骤,最终得出最优解。

初看割平面法可能有些懵,在这里介绍一下Gomory Cut。还是以上面的这个问题为例子。

在这里插入图片描述

我们首先使用单纯形法,求得线性规划的最优解。我们可以求得以下的结果

在这里插入图片描述

从图中我们可以看出,求出来的解x2为分整数,我们需要进行第一次Gomory cut。分别将等式两边的小数部分取出来,我们可得到

1 4 x 3 + 1 4 x 4 ≥ 1 2 \frac{1}{4}x_3+\frac{1}{4}x_4 \geq \frac{1}{2} 41x3+41x421

可能有人会对这个不等式的由来有些疑问,其实是这样的。

在这里插入图片描述
在这里插入图片描述

当我们切了之后相当于原本的优化问题又添加了一个不等式。接着我们需要使用对偶单纯型法进行求解。注意,s1是新引入的松弛变量。

在这里插入图片描述

反复重复上面的过程,最终我们能够求出问题的最优解。

参考资料:

  • coursera discrete optimization

相关文章:

  • 质量平台-方案设计
  • 含有NHS酯基团的化学交联剂 1426827-79-3,BCN-Osu,endo-BCN-NHS ester
  • 什么是GCC 基础概念版
  • 【云原生 | Kubernetes 系列】----使用Prometheus监控K8s集群
  • python基础(四、循环语句)
  • 视觉slam14讲 ——ch2实践部分
  • Android几种定时任务实现方式汇总
  • 【数据结构】哈夫曼编码与最优二叉树(哈夫曼树)
  • C++获取系统毫秒级时间(自1970年1月1日至今的毫秒数)
  • redis的详解和项目应用之PHP操作总结
  • 阿里、滴滴、华为等一线互联网分布式消息中间件:RocketMQ核心笔记
  • PostgreSQL的学习心得和知识总结(六十四)|关于PostgreSQL数据库 图式搜索(graph search)及递归查询 的场景说明
  • AI智能安防监控视频播放卡顿的原因排查与分析
  • 荧光染料Cy7 酰肼,Cy7 hydrazide,Cy7 HZ参数及结构式解析
  • OSPF——DR和BDR讲解
  • 【Amaple教程】5. 插件
  • JavaScript标准库系列——Math对象和Date对象(二)
  • laravel with 查询列表限制条数
  • Sublime text 3 3103 注册码
  • 关于List、List?、ListObject的区别
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 基于遗传算法的优化问题求解
  • 将 Measurements 和 Units 应用到物理学
  • 力扣(LeetCode)56
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 排序(1):冒泡排序
  • 使用 5W1H 写出高可读的 Git Commit Message
  • ​渐进式Web应用PWA的未来
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # 飞书APP集成平台-数字化落地
  • #### go map 底层结构 ####
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (4)Elastix图像配准:3D图像
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (七)Knockout 创建自定义绑定
  • (三)docker:Dockerfile构建容器运行jar包
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转)关于pipe()的详细解析
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .“空心村”成因分析及解决对策122344
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net 8.0 新的变化
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET轻量级ORM组件Dapper葵花宝典
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @AutoConfigurationPackage的使用
  • @Autowired注解的实现原理
  • @ComponentScan比较
  • @private @protected @public
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题