| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> 数学建模常用算法汇总及python,MATLAB实现(二)—— 整数规划 -> 正文阅读 |
|
[Python知识库]数学建模常用算法汇总及python,MATLAB实现(二)—— 整数规划 |
整数规划第3部分主要讲算法的具体实现, 如果对具体细节没有要求, 直接看1, 4就行, 直接用matlab内置的intlinprog函数或者python的cvxpy等第三方包 这里我个人更偏向于使用MATLAB求解 1. 从线性规划到整数规划1.1 整数规划是什么就是把一般的线性规划问题加点东西 约束决策变量为整数 举例: 比较下面两种 整 数 规 划 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 对于不同种类整数规划问题的求解方法
3.2 求解方法介绍matlab内置的intlinprog()方法的实现细节
基本上重要的就是分支定界法, 别的方法就了解一下就行 3.2.1 分支定界法3.2.1.1 文字介绍
? (1) 松弛问题无解, 则整数规划无解 ? (2) 松弛问题解为整数( 见1.1 ), 则整数规划解就是松弛规划的解
? 则对不是整数的决策变量增加新的约束 ? 向上取整或者向下取整做两个分支, 直到所有的解都是整数, 在所有的整数可行解中取最优解输出 3.2.1.2 流程图其中递归的部分 3.2.2 割平面法3.2.2.1文字介绍前面两步跟3.2.1.2一样, 前面两个步骤对整数规划都是通用的 第三部, 如果解中含有非整数变量, 则对松弛问题增加一个线性约束来割平面, 使得非整数解恰好在被割掉的一块中, 并且不能割掉原问题的可行解, 一直重复直到都是整数
4. 实现代码有一说一, 线性规划和整数规划部分, 还是MATLAB实现起来方便一些 python实现也有很多可以用的包, 但是都没有MATLAB打包的好, 效率也一般, 没有必要为了这个专门去学一个冷门的python包 建议亲这边使用MATLAB求解规划类的问题 4.1Matlab内置函数
4.1.1 函数原型
基本上和 4.1.2 数学原型参数命名都来自4.1.1的函数原型 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?为整数? 代码
附上答案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函数是直接打包好给我们用的, 具体这个函数中发生了什么细节, 使用了什么算法, 可以参考下面的内容 如果编代码过程中出现了奇怪的错误, 可以从原理上提供一种解决错误的可能 算法概述
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且为整数? 求解代码
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 12:09:15- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |