python 求解线性规划问题
时间:2022-07-24
本文章向大家介绍python 求解线性规划问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一个线性规划的实例:
某机床厂生产甲、乙两种机床,每台销售后的利润分别为 4000 元与 3000 元。生产甲机床需用 A、B 机器加工,加工时间分别为每台 2 小时和 1 小时;生产乙机床需用 A、B、C 三种机器加工,加工时间为每台各一小时。若每天可用于加工的机器时数分别为 A 机器 10 小时、B 机器 8 小时和C 机器 7 小时,问该厂应生产甲、乙机床各几台,才能使总利润最大?
上述问题的数学模型:设该厂生产x1 台甲机床和 x2 乙机床时总利润最大,则x1 , x2应满足
这里变量x1 , x2 称之为决策变量,(1)式被称为问题的目标函数,(2)中的几个不等式是问题的约束条件,记为 s.t.(即 subject to)。由于上面的目标函数及约束条件均为线性函数,故被称为线性规划问题。总之,线性规划问题是在一组线性约束条件的限制下,求一线性目标函数最大或最小的问题。
我们中学学过用图解法解二维的线性规划问题:
由图解法可知上述问题的最优解释 x1,x2 = (2, 6)
在python中,我们可以通过调用scipy库中的optimize模块来求解线性规划问题。
上述问题的求解代码如下:
import numpy as np
from scipy import optimize
#定义目标函数
Z = np.mat([-4,-3])
#定义约束条件
A = np.mat([[2,1], [1,1],[0,1]])
B = np.mat([10,8,7])
x1_bound = x2_bound =(0, None)
#默认求最小值,且约束条件都为≤,否则可以通过式子两边乘以 -1 来转换。
res = optimize.linprog(Z, A_ub = A, b_ub= B,bounds=(x1_bound, x2_bound))
print(res)
print("最优解:",res.x)
print(res.fun)
另一个更一般一点的问题:
只需要根据线性规划的标准型将目标函数和某些约束条件稍作变换。
#定义目标函数
Z = np.array([-2,-3,5])
A = np.array([[-2, 5, -1], [1, 3, 1]])
B = np.array([-10,12])
A_eq = [[1,1,1]]
b_eq = 7
x1_bound = x2_bound = x3_bound =(0, None)
#默认求最小值,且约束条件都为≤,否则可以通过式子两边乘以 -1 转换。
res = optimize.linprog(Z, A_ub= A, b_ub= B,A_eq= A_eq, b_eq= b_eq, bounds=(x1_bound, x2_bound,x3_bound))
print(res)
很多看起来不是线性规划的问题也可以通过变换变成线性规划的问题来解决,如:
通过转换,即可把上述n维带绝对值符号的规划问题转换成2n维的线性规划问题。
=>
求解代码:
#定义目标函数
Z = np.array([2,2,3,3])
A = np.array([[-3,3,-4,4], [2,-2,-1,1],[1,-1,-3,3]])
B = np.array([-100,20,-25])
#x1_bound = x2_bound = x3_bound =x4_bound =(0, None)
#默认求最小值,且约束条件都为≤,否则可以通过式子两边乘以 -1 转换。
res = optimize.linprog(Z, A_ub= A, b_ub= B, bounds=((0, None), (0, None),(0, None),(0, None)))
x1 = res.x[0] - res.x[1]
x2 = res.x[2] - res.x[3]
print((x1,x2))
- Android实现竖着的滑动刻度尺效果,选择身高(竖向的)
- DedeCMS全版本通杀SQL注入漏洞利用代码及工具
- Android实现滑动刻度尺效果,选择身高体重和生日
- 浅谈开源web程序后台的安全性
- Web漏洞演练平台 – ZVulDrill
- Android内存泄漏终极解决篇(上)
- 走近科学:我是如何入侵Instagram查看你的私人片片的
- 在线手写识别的多卷积神经网络方法
- 苹果发布OS X 10.9.2更新,修复SSL漏洞
- Android内存泄漏终极解决篇(下)
- 利用Volatility查找系统中的恶意DLL
- 雪人行动:利用IE10 0day漏洞的APT攻击剑指美国军方情报
- Android开发:最详细的 Toolbar 开发实践总结
- 关于yubikey对web应用的杞人之忧
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- OpenGL ES for Android 相机预览
- OpenGL ES for Android 相机预览适配不同分辨率的手机
- Flutter Widgets 之 Container
- Flutter Widgets 之 Row和Column
- Flutter Widgets 之 SafeArea
- Flutter Widgets 之 Wrap
- Flutter Widgets 之 Expanded和Flexible
- 可能是Asp.net Core On host、 docker、kubernetes(K8s) 配置读取的最佳实践
- Flutter Widgets 之 AnimatedContainer
- Flutter Widgets 之 Opacity 和AnimatedOpacity
- 聊聊常见的服务(接口)认证授权
- Flutter Widgets 之 FutureBuilder
- [Hei-Ocelot-Gateway ].Net Core Api网关Ocelot的开箱即用版本
- Flutter Widgets 之 InkWell 和 Ink
- Flutter Widgets 之 BottomNavigationBar