整数规划

第3部分主要讲算法的具体实现,

如果对具体细节没有要求, 直接看1, 4就行, 直接用matlab内置的intlinprog函数或者python的cvxpy等第三方包

这里我个人更偏向于使用MATLAB求解

文章目录

  • 整数规划
    • 1. 从线性规划到整数规划
      • 1.1 整数规划是什么
      • 将线性规划决策变量解限制为整数可能会出现的情况
    • 2. 整数规划分类
      • 2.1 纯整数规划
      • 2.2 全整数规划
      • 2.3 混合整数规划
      • 2.4 0-1整数规划
    • 3. 整数规划求解方法
      • 3.1 对于不同种类整数规划问题的求解方法
      • 3.2 求解方法介绍
        • 3.2.1 分支定界法
          • 3.2.1.1 文字介绍
          • 3.2.1.2 流程图
        • 3.2.2 割平面法
          • 3.2.2.1文字介绍
    • 4. 实现代码
      • 4.1Matlab内置函数
        • 4.1.1 函数原型
        • 4.1.2 数学原型
        • 4.1.3 实现代码举例
          • 求解
          • 代码
          • 附上答案
        • 4.1.4 进阶内容: intlinprog函数具体使用了什么算法
      • 4.2 python实现
        • 4.2.1 这里使用cvxpy包举例:
          • 题目
          • 求解代码

1. 从线性规划到整数规划

1.1 整数规划是什么

就是把一般的线性规划问题加点东西

约束决策变量为整数

举例: 比较下面两种
线 性 规 划 x = ( x i ) n a r g m i n ∑ i = 1 n c i x i s . t . { A ⋅ x ≤ b A e q ⋅ x = b e q l b ≤ x ≤ u b 线性规划\\ x = (x_i)_n\\ argmin\; \sum^n_{i=1}c_ix_i \quad s.t. \left\{ \begin{aligned} A\cdot x \le b \\ Aeq \cdot x = beq \\ lb \le x \le ub \end{aligned} \right .\\\\ 线性规划x=(xi​)n​argmini=1∑n​ci​xi​s.t.⎩⎪⎨⎪⎧​A⋅x≤bAeq⋅x=beqlb≤x≤ub​

整 数 规 划 x = ( x i ) n a r g m i n ∑ i = 1 n c i x i s . t . { x 1 , x 3 为 整 数 A ⋅ x ≤ b A e q ⋅ x = b e q l b ≤ x ≤ u b 这 个 例 子 相 对 于 线 性 规 划 约 束 了 两 个 决 策 变 量 x 1 , x 3 为 整 数 有 整 数 约 束 的 规 划 就 是 整 数 规 划 这 个 例 子 就 是 一 个 整 数 规 划 整数规划\\ x = (x_i)_n\\ argmin\; \sum^n_{i=1}c_ix_i \quad s.t. \left\{ \begin{aligned} x_1, x_3 为整数\\ A\cdot x \le b \\ Aeq \cdot x = beq \\ lb \le x \le ub \end{aligned} \right .\\\\ 这个例子相对于线性规划约束了两个决策变量x_1, x_3为整数\\有整数约束的规划就是整数规划\\这个例子就是一个整数规划 整数规划x=(xi​)n​argmini=1∑n​ci​xi​s.t.⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​x1​,x3​为整数A⋅x≤bAeq⋅x=beqlb≤x≤ub​这个例子相对于线性规划约束了两个决策变量x1​,x3​为整数有整数约束的规划就是整数规划这个例子就是一个整数规划

整数规划求解不是将线性规划解简单取整得到的

将线性规划决策变量解限制为整数可能会出现的情况

(1) 原线性规划最优解就是整数, 那么可以直接转化为整数规划问题, 最优解和线性规划问题最优解一致

(2) 无可行解 (无最优解)

(3) 有最优解, 但相对于原线性规划的最优值变差

引入松弛变量将不等式问题转化为等式问题

2. 整数规划分类

2.1 纯整数规划

所有决策变量都是非负整数

2.2 全整数规划

除了决策变量是整数, 系数aij和常数bij也是整数 ( 这时引进的松弛变量和剩余变量也是整数 )

2.3 混合整数规划

只有一部分决策变量是非负整数

2.4 0-1整数规划

决策变量只取0或1

3. 整数规划求解方法

3.1 对于不同种类整数规划问题的求解方法

一般整数规划 0-1整数规划
分支定界法 匈牙利法
割平面法 隐枚举法

因为整数规划可行解是有限集 ( 画图画出来就是可行域里的网格 ) 可以使用穷举法, 即把每一个可行解都带入优化目标计算哪个最优, 但是穷举法浪费资源, 效率低, 因此不推荐使用 ,在这里也没有写出来

3.2 求解方法介绍

matlab内置的intlinprog()方法的实现细节

  1. 使用[线性规划预处理]缩减问题的规模。
  2. 使用[线性规划]求解初始松弛(非整数)问题。
  3. 执行[混合整数规划预处理]以收紧混合整数问题的 LP 松弛。
  4. 尝试[切割生成]以进一步收紧混合整数问题的 LP 松弛。
  5. 尝试使用[启发式方法]求得整数可行解。
  6. 使用[分支定界]算法系统地搜索最优解。此算法通过限制整数变量的可能值范围来求解 LP 松弛问题。它尝试在最优目标函数值上生成一系列更新边界。

基本上重要的就是分支定界法, 别的方法就了解一下就行

3.2.1 分支定界法
3.2.1.1 文字介绍
  1. 不考虑整数限制, 先求出松弛问题 ( 不限制为整数的条件相等的线性规划问题 ) 的最优解

  2. 考虑特殊情况:

​ (1) 松弛问题无解, 则整数规划无解

​ (2) 松弛问题解为整数( 见1.1 ), 则整数规划解就是松弛规划的解

  1. *若以上都不满足

​ 则对不是整数的决策变量增加新的约束

​ 向上取整或者向下取整做两个分支, 直到所有的解都是整数, 在所有的整数可行解中取最优解输出
x i ⟶ x i ≥ ⌈ x i ⌉ 或 x i ⟶ x i ≤ ⌊ x i ⌋ x_i \quad \longrightarrow \quad x_i \geq \lceil x_i \rceil \\ 或\\ x_i \quad \longrightarrow \quad x_i \leq \lfloor x_i \rfloor xi​⟶xi​≥⌈xi​⌉或xi​⟶xi​≤⌊xi​⌋

3.2.1.2 流程图
Created with Raphaël 2.3.0 求非整数约束最优解 是否整数解 选取某非整数变量分支 (递归)增加向上取整约束分支 比较所有可行解找出最优解 (递归)增加向下取整约束分支 yes yes no

其中递归的部分

Created with Raphaël 2.3.0 递归程序开始 增加分支 是否全部是整数解 加入到可行解集合 结束递归 选取某非整数变量分支 (递归)增加向上取整约束分支 (递归)增加向下取整约束分支 yes no yes no
3.2.2 割平面法
3.2.2.1文字介绍

前面两步跟3.2.1.2一样, 前面两个步骤对整数规划都是通用的

第三部, 如果解中含有非整数变量, 则对松弛问题增加一个线性约束来割平面, 使得非整数解恰好在被割掉的一块中, 并且不能割掉原问题的可行解, 一直重复直到都是整数

实际使用不多, 可以了解对比方法之间的区别

4. 实现代码

有一说一, 线性规划和整数规划部分, 还是MATLAB实现起来方便一些

python实现也有很多可以用的包, 但是都没有MATLAB打包的好, 效率也一般, 没有必要为了这个专门去学一个冷门的python包

建议亲这边使用MATLAB求解规划类的问题

4.1Matlab内置函数

内置函数 intlinprog()

可以解决混合整数规划, 可以指定哪些决策变量有整数约束

4.1.1 函数原型
[x, fval] = intlinprog(c, intcon, A, b, Aeq, beq, lb, ub)

基本上和 linprog() 一样, intcon参数就是指定哪些变量有整数约束

4.1.2 数学原型

参数命名都来自4.1.1的函数原型
a r g m i n c T x s . t . { x ( i n t c o n ) 是 整 数 A ⋅ x ≤ b A e q ⋅ x = b e q l b ≤ x ≤ u b argmin\; c^Tx\quad s.t. \left\{ \begin{aligned} x_{(intcon)} \; 是整数 \\ A\cdot x \le b \\ Aeq \cdot x = beq \\ lb \le x \le ub \end{aligned} \right . argmincTxs.t.⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​x(intcon)​是整数A⋅x≤bAeq⋅x=beqlb≤x≤ub​

4.1.3 实现代码举例
求解

a r g m a x z = 5 x 1 + 8 x 2 s . t . { x 1 + x 2 ≤ 6 5 x 1 + 9 x 2 ≤ 45 x 1 , x 2 ≥ 0 , 且 x 1 , x 2 为 整 数 argmax \enspace z=5x_1 + 8x_2 \qquad\\ s.t. \left\{ \begin{aligned} x_1 + x_2 \le 6 \\ 5x_1 + 9x_2 \le 45\\ x1, x2\ge0, 且x_1, x_2为整数 \end{aligned} \right . argmaxz=5x1​+8x2​s.t.⎩⎪⎨⎪⎧​x1​+x2​≤65x1​+9x2​≤45x1,x2≥0,且x1​,x2​为整数​

代码
c = [-5; -8];
% 无论线性规划还是整数规划, 在matlab中默认都是求最小值,
% 题目要求最大值, 所以加个负号A = [1, 1;5, 9];b = [6; 45];lb = zeros(2, 1);intcon = [1, 2];
% 着重看上面这个, 这里指定了x1, x2为整数
% 所以根据4.1.2数学原型中写到的intcon的意义, intcon = [1, 2][x, fval] = intlinprog(c, intcon, A, b, [], [], lb, []);x
-fval   % 因为之前为了求最大值加了负号, 所以这里再把答案负回来
附上答案

x 1 = 0 x 2 = 5 f v a l = 40 x_1 = 0 \qquad x_2=5 \qquad fval = 40 x1​=0x2​=5fval=40

4.1.4 进阶内容: intlinprog函数具体使用了什么算法

intlinprog这个MATLAB函数是直接打包好给我们用的, 具体这个函数中发生了什么细节, 使用了什么算法, 可以参考下面的内容

如果编代码过程中出现了奇怪的错误, 可以从原理上提供一种解决错误的可能

算法概述

intlinprog 使用以下策略来求解混合整数线性规划。intlinprog 顺着执行下面的算法, 如果哪一步执行出了结果, 就不会再继续执行更下面的算法

  1. 使用线性规划预处理缩减问题的规模。
  2. 使用线性规划求解初始松弛(非整数)问题。
  3. 执行混合整数规划预处理以收紧混合整数问题的 LP 松弛。
  4. 尝试切割生成以进一步收紧混合整数问题的 LP 松弛。
  5. 尝试使用启发式方法求得整数可行解。
  6. 使用分支定界算法系统地搜索最优解。此算法通过限制整数变量的可能值范围来求解 LP 松弛问题。它尝试在最优目标函数值上生成一系列更新边界。

4.2 python实现

可以使用的包plup, scipy(得自己实现整数规划算法的细节, 没有必要), 还有python的运筹学包, python-mip等等

对比了一下最好用的是cvxpy包

4.2.1 这里使用cvxpy包举例:
题目

m i n z = 40 x 1 + 90 x 2 , s . t . { 9 x 1 + 7 x 2 ≤ 56 7 x 1 + 20 x 2 ≥ 70 x 1 , x 2 ≥ 0 且 为 整 数 min\quad z=40x_1+90x_2,\\ s.t. \left\{ \begin{aligned} 9x_1+7x_2 \le 56\\ 7x_1+20x_2\ge 70\\ x_1, x_2 \ge0 且为整数 \end{aligned} \right . minz=40x1​+90x2​,s.t.⎩⎪⎨⎪⎧​9x1​+7x2​≤567x1​+20x2​≥70x1​,x2​≥0且为整数​

求解代码
import cvxpy as cp
import numpy as np# 不懂见数学原型中的定义, 什么价值向量资源向量什么的
c = np.array([40, 90])
a = np.array([[9, 7],[-7, -20]])b = np.array([56, -70])######
x = cp.Variable(2, interger=True) # 用cvxpy来定义两个整数决策变量, 也就是约束x为整数obj = cp.Minimize(c*x)   # 目标函数cons = [a * x <= b, x >= 0]      # 约束条件
prob = cp.Problem(obj, cons)   # 构建问题模型prob.solve(solver='GLPK_MI', verbose=True) # 求解
print("最优值", prob.value)
print("最优解", x.value)

数学建模常用算法汇总及python,MATLAB实现(二)—— 整数规划相关推荐

  1. 数学建模常用算法汇总及python,MATLAB实现(五) —— 拟合

    拟合 比较重要的就是2.1和2.3 2.2可以浅看一下, 自己敲着试一试 就拟合部分来说, MATLAB比python强大很多, 自带cftool工具包, 并且有很多快速的函数, 个人建议使用MATL ...

  2. 数学建模常用算法汇总及python,MATLAB实现(六) —— pandas和matlab实现插值

    插值 2的拉格朗日插值用的其实比较少, 可以看一下了解一下插值的原理 主要看看3里的结论和4的实现代码 文章目录 插值 1. 定义 2.拉格朗日插值 2.1 概念 3. Rouge现象 3.1 是什么 ...

  3. 数学建模常用算法汇总及python,MATLAB实现(一)—— 线性规划

    线性规划 文章目录 线性规划 数学原型 1. matlab求解 函数原型 2. python求解 3. 例题 matlab求解 数学原型 m i n x c ⃗ T x ⃗ s . t . { A x ...

  4. 【Python数学建模常用算法代码(二)之BP神经网络】

    Python数学建模常用算法代码(二) BP神经网络模型Python代码 import numpy as np import math import random import string impo ...

  5. 数学建模——主成分分析算法详解Python代码

    数学建模--主成分分析算法详解Python代码 import matplotlib.pyplot as plt #加载matplotlib用于数据的可视化 from sklearn.decomposi ...

  6. 【数学建模常用算法】之灰色预测模型GM

    作者:張張張張 github地址:https://github.com/zhanghekai [转载请注明出处,谢谢!] 文章目录 一.灰色预测模型GM(1,1) 1.数据检验与数据预处理 1.1 构 ...

  7. 二维动态规划降维误差一般为多少_数学建模常用算法模型

    数学模型的分类 按模型的数学方法分: 几何模型.图论模型.微分方程模型.概率模型.最优控制模型.规划论模型.马氏链模型等 按模型的特征分: 静态模型和动态模型,确定性模型和随机模型,离散模型和连续性模 ...

  8. 数学建模常用算法—灰色预测

    今天数模君给大家讲解一下数学建模比赛中常用的一种预测方法:灰色预测法. 目录 模型的含义 灰色预测的原理 实例 模型的含义 灰色预测模型 ( Gray Forecast Model )是通过少量的.不 ...

  9. 数学建模常用算法—马尔可夫预测

    今天数模君带大家学习一下数学建模中的预测算法之马尔科夫预测. 目录 模型的含义 实例分析 模型的含义 马尔可夫(Markov)预测法,就是一种关于事件发生的概率预测方法.它是根据事件的目前状况来预测其 ...

最新文章

  1. 阿里云云主机添加swap分区与swap性能优化
  2. 记录spark-yarn模式下提交自己写的java程序
  3. 写一个易于维护使用方便性能可靠的Hybrid框架(一)—— 思路构建
  4. 【Python CheckiO 题解】Roman Numerals
  5. 计算机研究生进中国银行,听说中行笔试把研究生学姐都难哭了…
  6. python代码加密cython_python通过cython实现加密
  7. 键盘里的电脑:树莓派400正式发布,售价70美元
  8. Metasploit工具的使用
  9. 数学建模评价类模型——模糊综合评价
  10. 银河麒麟v10下载(服务器版 桌面版) - 2022-09-08更新
  11. 三维空间曲面的切平面以及在某一点上的切线,法线
  12. word每个标题前都有个小黑点,怎么去掉?
  13. DirectX--给视频加马赛克、字符OSD
  14. MeshBaker优化原理
  15. iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5000 -j DNAT --to-destinatio
  16. java编程获取屏幕分辨率_Java及Jquery获取屏幕分辨率的实现代码
  17. java文件后缀_java源文件名的后缀是什么?
  18. 2018-8-29-win2d-渐变颜色
  19. python--圆周率的计算
  20. 利用南十字星座测量经纬度的方法

热门文章

  1. 编译micropython固件时解决fatal error: mbedtls/aes.h: No such file or directory等问题
  2. linux中卸载mysql数据库_Linux下彻底卸载mysql数据库
  3. 市场井喷 到家服务将颠覆在线教育模式
  4. 使用vscode ssh连接linux虚拟机
  5. ios如何解除dns被劫持_iOS监控-DNS劫持
  6. PHP实现微信小程序授权登录
  7. 作业帮显示连接服务器失败,App提示连接不到服务器
  8. 100道经典测试开发面试题,从基础到进阶(1)
  9. Linux 下进入Vi 与退出方法
  10. 1092: 【入门】时间的差! 题解