运用python scipy来求解线性规划问题
发表于:2024-09-21 作者:千家信息网编辑
千家信息网最后更新 2024年09月21日,运用python scipy来求解线性规划问题,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。最近项目中遇到了一个有意思的
千家信息网最后更新 2024年09月21日运用python scipy来求解线性规划问题
运用python scipy来求解线性规划问题,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
最近项目中遇到了一个有意思的技术点,运用线性规划数学模型,求最优解的问题。
由于我后台是springcloud,所以我调查到两种实现方式。
第一种是运用python的scipy开源库写一个python脚本,然后java后台调用python脚本,求最优解,然后再将结果返回。
第二种是运用java中ibm组件Cplex直接求解,但分为收费和免费版,免费版决策变量限制为1000个,但也够了。找jar包和dll费劲点。
发现他们俩算出来的最优解是相同的,但各个决策变量不太相同。
这里记录一下运用python求解的方法。
项目中的不等式方程组是∑求和形式的,这里就手动打码先假设决策变量的数量为 5 * 3 个,经过化简后得到多元一次不等式组如下:
求解最大值 = AX + AY + AZ + BX + BY + BZ + CX + CY + CZ + DX + DY + DZ + EX + EY + EZAX + AY + AZ <= 25400BX + BY + BZ <= 18600CX + CY + CZ <= 39800DX + DY + DZ <= 53200EX + EY + EZ <= 5900AX + AY + AZ <= 10000BX + BY + BZ <= 10000CX + CY + CZ <= 10000DX + DY + DZ <= 10000EX + EY + EZ <= 10000AX + BX + CX + DX + EX >= 15000AY + BY + CY + DY + DY >= 5000AZ + BZ + CZ + DZ + DZ >= 10000(50.25-50)*AX + (49.86-50)*BX + (68.80-50)*CX + (49.79-50)*DX + (48.77-50)*EX >= 0(50.25-60)*AY + (49.86-60)*BY + (68.80-60)*CY + (49.79-60)*DY + (48.77-60)*EY >= 0(50.25-55)*AZ + (49.86-55)*BZ + (68.80-55)*CZ + (49.79-55)*DZ + (48.77-55)*DZ >= 0(30.95*(1-2/100)-30)*AX + (31.52*(1-3/100)-30)*BX + (30.58*(1-1/100)-30)*CX + (30.17*(1-1/100)-30)*DX + (27.83*(1-1/100)-30)*EX >= 0(30.95*(1-2/100)-30)*AY + (31.52*(1-3/100)-30)*BY + (30.58*(1-1/100)-30)*CY + (30.17*(1-1/100)-30)*DY + (27.83*(1-1/100)-30)*EY >= 0(30.95*(1-2/100)-30)*AZ + (31.52*(1-3/100)-30)*BZ + (30.58*(1-1/100)-30)*CZ + (30.17*(1-1/100)-30)*DZ + (27.83*(1-1/100)-30)*EZ >= 0(11.32*(1-2/100)-10)*AX + (12.83*(1-3/100)-10)*BX + (16.06*(1-1/100)-10)*CX + (5.68*(1-1/100)-10)*DX + (8.54*(1-1/100)-10)*EX >= 0(11.32*(1-2/100)-10)*AY + (12.83*(1-3/100)-10)*BY + (16.06*(1-1/100)-10)*CY + (5.68*(1-1/100)-10)*DY + (8.54*(1-1/100)-10)*EY >= 0(11.32*(1-2/100)-10)*AZ + (12.83*(1-3/100)-10)*BZ + (16.06*(1-1/100)-10)*CZ + (5.68*(1-1/100)-10)*DZ + (8.54*(1-1/100)-10)*EZ >= 0(6*(1-2/100)-5)*AX + (4*(1-3/100)-5)*BX + (5*(1-1/100)-5)*CX + (2*(1-1/100)-5)*DX + (5*(1-1/100)-5)*EX <= 0(6*(1-2/100)-5)*AY + (4*(1-3/100)-5)*BY + (5*(1-1/100)-5)*CY + (2*(1-1/100)-5)*DY + (5*(1-1/100)-5)*EY <= 0(6*(1-2/100)-5)*AZ + (4*(1-3/100)-5)*BZ + (5*(1-1/100)-5)*CZ + (2*(1-1/100)-5)*DZ + (5*(1-1/100)-5)*EZ <= 0非负约束:AX,AY,AZ,BX,BY,BZ,CX,CY,CZ,DX,DY,DZ,EX,EY,EZ >= 0
上面这些是根据我自己的项目得到的不等式组,可以根据自己的项目来做相应改动。
# coding=utf-8import jsonimport sysimport numpy as npfrom scipy import optimize as opdef solve(aaaaa, bbbbb, ccccc): # 定义目标函数系数矩阵 c = np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) # 定义不等式约束左端系数矩阵 a_ub = np.array([ [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1], [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1], [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1], [-1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0], [0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0], [0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1], [50 - 50.25, 0, 0, 50 - 49.86, 0, 0, 50 - 68.80, 0, 0, 50 - 49.79, 0, 0, 50 - 48.77, 0, 0], [0, 60 - 50.25, 0, 0, 60 - 49.86, 0, 0, 60 - 68.80, 0, 0, 60 - 49.79, 0, 0, 60 - 48.77, 0], [0, 0, 55 - 50.25, 0, 0, 55 - 49.86, 0, 0, 55 - 68.80, 0, 0, 55 - 49.79, 0, 0, 55 - 48.77], [30 - 30.95 * (1 - 2 / 100), 0, 0, 30 - 31.52 * (1 - 3 / 100), 0, 0, 30 - 30.58 * (1 - 1 / 100), 0, 0, 30 - 30.17 * (1 - 1 / 100), 0, 0, 30 - 27.83 * (1 - 1 / 100), 0, 0], [0, 30 - 30.95 * (1 - 2 / 100), 0, 0, 30 - 31.52 * (1 - 3 / 100), 0, 0, 30 - 30.58 * (1 - 1 / 100), 0, 0, 30 - 30.17 * (1 - 1 / 100), 0, 0, 30 - 27.83 * (1 - 1 / 100), 0], [0, 0, 30 - 30.95 * (1 - 2 / 100), 0, 0, 30 - 31.52 * (1 - 3 / 100), 0, 0, 30 - 30.58 * (1 - 1 / 100), 0, 0, 30 - 30.17 * (1 - 1 / 100), 0, 0, 30 - 27.83 * (1 - 1 / 100)], [10 - 11.32 * (1 - 2 / 100), 0, 0, 10 - 12.83 * (1 - 3 / 100), 0, 0, 10 - 16.06 * (1 - 1 / 100), 0, 0, 10 - 5.68 * (1 - 1 / 100), 0, 0, 10 - 8.54 * (1 - 1 / 100), 0, 0], [0, 10 - 11.32 * (1 - 2 / 100), 0, 0, 10 - 12.83 * (1 - 3 / 100), 0, 0, 10 - 16.06 * (1 - 1 / 100), 0, 0, 10 - 5.68 * (1 - 1 / 100), 0, 0, 10 - 8.54 * (1 - 1 / 100), 0], [0, 0, 10 - 11.32 * (1 - 2 / 100), 0, 0, 10 - 12.83 * (1 - 3 / 100), 0, 0, 10 - 16.06 * (1 - 1 / 100), 0, 0, 10 - 5.68 * (1 - 1 / 100), 0, 0, 10 - 8.54 * (1 - 1 / 100)], [6 * (1 - 2 / 100) - 5, 0, 0, 4 * (1 - 3 / 100) - 5, 0, 0, 5 * (1 - 1 / 100) - 5, 0, 0, 2 * (1 - 1 / 100) - 5, 0, 0, 5 * (1 - 1 / 100) - 5, 0, 0], [0, 6 * (1 - 2 / 100) - 5, 0, 0, 4 * (1 - 3 / 100) - 5, 0, 0, 5 * (1 - 1 / 100) - 5, 0, 0, 2 * (1 - 1 / 100) - 5, 0, 0, 5 * (1 - 1 / 100) - 5, 0], [0, 0, 6 * (1 - 2 / 100) - 5, 0, 0, 4 * (1 - 3 / 100) - 5, 0, 0, 5 * (1 - 1 / 100) - 5, 0, 0, 2 * (1 - 1 / 100) - 5, 0, 0, 5 * (1 - 1 / 100) - 5] ]) # 定义不等式约束右端项矩阵 # 非常接近0的值 e = 1e-10 b_ub = np.array( [25400, 18600, 39800, 53200, 5900, 10000, 10000, 10000, 10000, 10000, 20000, 20000, 20000, 20000, 20000, -15000, -5000, -10000, -e, -e, -e, -e, -e, -e, -e, -e, -e, e, e, e]) # 取值范围 ax = ay = az = bx = by = bz = cx = cy = cz = dx = dy = dz = ex = ey = ez = (0, 10000) bounds = (ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez) # 调用函数进行求解,默认求解最小值,求解最大值使用-c并取结果相反数,maxiter最大迭代次数 return op.linprog(-c, a_ub, b_ub, bounds=bounds, options={'maxiter': 50})if __name__ == '__main__': aaaaa= """111""" bbbbb= """222""" ccccc= """333""" # sys.argv[i] res = solve(aaaaa, bbbbb, ccccc) print(res) exit()# 执行结果# con: array([], dtype=float64)# fun: -44280.11226613013# message: 'Optimization terminated successfully.'# nit: 8# slack: array([1.54000001e+04, 8.60000008e+03, 2.98000001e+04, 4.32000001e+04,# 1.61988736e+03, 8.62767956e-05, 8.33909326e-05, 1.16868736e-04,# 8.36751933e-05, 5.71988736e+03, 1.00000001e+04, 1.00000001e+04,# 1.00000001e+04, 1.00000001e+04, 1.57198874e+04, 6.58111172e+03,# 3.95477828e+03, 3.74422226e+03, 1.21703633e+04, 4.95361919e+03,# 6.34258264e+03, 6.66164697e-05, 6.74106730e-05, 9.34142053e-07,# 7.20490633e+03, 2.40991082e+04, 1.26944988e+04, 1.52974587e+04,# 5.68045285e+03, 1.23360938e+04])# status: 0# success: True# x: array([6771.5673779 , 652.76382833, 2575.6687075 , 7211.86997104,# 773.63550554, 2014.49444003, 820.59747095, 5091.61932829,# 4087.78308389, 4309.51511365, 1687.54017157, 4002.9446311 ,# 2467.561791 , 749.21944752, 1063.33139782])
需要注意的点:
一、在定义不等式左端和右端矩阵时,默认不等式都是小于等于的,可以先将不等式反转。
要不就直接取相反数(我就是)。类似这段中不等式左端和右端在定义矩阵时都取了相反数:
AX + BX + CX + DX + EX >= 15000
二、在定义不等式左端和右端矩阵时,先将决策变量位置对齐,要是对齐的位置上没有就用0替代。对齐后的不等式:
AX + 0AY + 0AZ + BX + 0BY + 0BZ + CX + 0CY + 0CZ + DX + 0DY + 0DZ + EX + 0EY + 0EZ >= 15000
三、在求解时默认计算最小值,如果想计算最大值就加一个负号,算出来的值把负号去掉就是最大值。类似这段中的 -c:
return op.linprog(-c, a_ub......................
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。
不等式
矩阵
最大
变量
最大值
项目
决策
相反数
结果
线性规划
线性
问题
规划
最小
相同
位置
函数
后台
就是
系数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
会计人员网络安全
华为服务器备份
哇扑网络技术有限公司
软件开发的功能图
pc端网络技术
网络安全维护外包公司
seer数据库密码错误3次
苹果炒股交易软件开发
table 隐藏数据库
网络安全太烦恼
东莞有招聘网络安全员的吗
软件开发期目标任务
海曙敏捷软件开发平台
非计算机领域的网络安全密钥
大手互联网科技有限公司
清单软件开发人工费标准
手机我的世界定位服务器进不去
阳江无限软件开发直销价
软件开发公司是啥意思
主宰之剑和罗宁哪个服务器好
奉贤区信息软件开发品质保障
网络安全管理员常用软件
魂斗罗服务器
服务器一键恢复会丢失数据吗
生信数据库验证
平时怎样做到网络安全
数据库创建一个查询怎么操作
四维星软件开发
教育软件开发哪家好
钢城区举办网络安全进校园活动