【管理运筹学】第 5 章 | 整数规划 (3,隐枚举法计算步骤)

文章目录


引言

经过前文,了解以及体会到 0-1 变量的特性后,我们来研究该如何去求解这类特殊的 0-1 整数规划模型。


四、0-1 整数规划

4.2 0-1 整数规划的解法

既然是整数规划,那么所有可行解的数量便是有限的,全枚举法便是一种算法。检查每个变量取 0 或 1 的所有组合,满足所有约束条件并使得目标函数最优的组合就是 0-1 整数规划的最优解。

若 0-1 变量有 n 个,需要检查 2 n 2^n 2n 个变量组合。当 n n n 数量较大时,想要靠全部列举出来,几乎是不可能的。

下面介绍一种隐枚举法,只要检查全部变量组合的一部分组合就可以求出最优解,这有点像前面讲过的分支定界法。

4.2.1 0-1 规划模型标准型

首先,要应用隐枚举法进行求解,必须将原模型化为如下标准型。

在这里插入图片描述

其中, c j ≥ 0 c_j \geq 0 cj0 b i b_i bi 可以是正数、负数或 0 ,所有约束条件必须是 ” ≤ ” ”\leq ” 型。

和平常的标准型有一些不同,不用化成等式,右端可以是负数,但是必须是求最小。

如果所给的模型不是标准形式,可以通过如下方法进行变换。

  1. 如果目标函数求最大,可将目标函数乘 -1 。
  2. 如果变量 x j x_j xj 对应的目标函数系数 c j ≤ 0 c_j \leq 0 cj0 ,可以用 ( 1 − x j ) (1-x_j) (1xj) 替换 x j x_j xj ,最后记得还原结果。
  3. 如果约束条件为 “ ≥ ” “\geq” 形式,将其乘上 -1 。
  4. 如果约束条件为 “ = ” “=” = 形式,将其变为一个 " ≥ " "\geq" "" 和一个 " ≤ " "\leq" "" ,将前者乘以 -1 。

4.2.2 隐枚举法计算步骤

隐枚举法首先令全部变量为 0 ,检验解是否可行。若可行, z = 0 z=0 z=0 ,已取得最优解;若不可行,则令一个变量取值为 0 或 1 ,称为固定变量。固定变量每一个值对应一个子问题,可将问题分为两个子域,其余未被指定取值的变量称为自由变量。

根据标准型要求,这些自由变量的系数均为非负,令所有自由变量为 0 ,加上固定变量的取值,组合该子域的解。经过检验,或停止分支,或继续指定固定变量,直至没有自由变量或全部子域停止分支为止。

流程图如下所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由于第 3,4,5,均有停止分支的情况,对于这些子域自由变量取 0 或 1 值的所有可能组合都被隐含地考虑了,不必再一一列举。所以这种方法称为隐枚举法,可大大减少计算量。

同时,实际解题中,指定固定变量时,可优先指定目标函数系数最小的变量,加快计算速度。


写在最后

隐枚举法求解过程还是相对复杂和繁琐些,对待每一步都需要理清思路和逻辑。下篇文章我们来学习指派问题的相关内容。


http://www.niftyadmin.cn/n/4954994.html

相关文章

VSCode之C++ SQLite3 SmartDB实现

背景 承接上篇VSCode配置之C & SQLite3极简配置方案,参考《深入应用C11: 代码优化与工程级应用》,基于VSCodeCmake无痛实现SmartDB。 GitHub路径: smartDB_tutorial 结果展示 主要变化(与SmartDB1.3相比) 1)使用…

基于Flink CDC实时同步PostgreSQL与Tidb【Flink SQL Client模式下亲测可行,详细教程】

文章目录 一、PostgreSQL作为数据来源(source),由flink读取1.postgre安装与配置2.flink安装与配置3.flink cdc postgre配置3.1 postgre配置(for flink cdc)3.2 flink cdc postgres的jar包下载 4.flink cdc postgre测试…

UGUI可视化组件Image, RawImage

一.组件Image 1.1 Image的属性 创建的Image对象自带Image组件,用来显示图片,其属性说明如下 属性:功能:Source Image表示要显示的图像的纹理(必须作为精灵导入)。Color要应用于图像的颜色,会和…

Linux中shell脚本——for、while循环及脚本练习

目录 一.for循环 1.1.基本格式 1.2.类C语言格式 二.while循环 2.1.基本格式 2.2.死循环语句 三.跳出循环 3.1.continue跳出循环 3.2.break跳出循环 四.常用循环 4.1.循环打印九九乘法表 4.2.循环ping测试某个网段网络连通性 4.3.while死循环实现猜数字游戏 4.4.数…

十二、Linux如何修改文件/文件夹所属用户or用户组?chown命令

目录 1、基础语法 2、修改目标用户: 3、修改用户组: 4、使用-R命令,并同时修改用户/用户组 1、基础语法 chown [-R] [目标用户][:][目标用户组] 被修改文件/文件夹 (1)选项-R:同chmod,对文…

深度学习loss变为nan的问题

在网上查了一些资料,但是这个情况和网上都不太一样。前100epoch能正常训练,loss缓慢下降,精度缓慢增大,但是突然loss就Nan了,我想应该不是样本问题也不是梯度爆炸或者loss中有除0吧,毕竟都训练了100epoch了…

大数据课程K3——Spark的常用案例

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Spark的常用案例——WordCount; ⚪ 掌握Spark的常用案例——求平均值; ⚪ 掌握Spark的常用案例——求最大值和最小值; ⚪ 掌握Spark的常用案例——TopK; ⚪ 掌握Spark的常用案例…

mybatis入门Idea搭建

一、概念 1、什么是mybatis? MyBatis是一个开源的Java持久层框架,它提供了一种简化数据库访问的方式。它的主要作用是将Java对象与数据库表之间进行映射,使开发者可以通过面向对象的方式操作数据库,而不需要编写大量的SQL语句。M…