目录
一、问题
何为线性规划问题:
二、python进行求解
1.通过观察matlab解线性规划步骤进行求解
2.python求解步骤
1)求解用到的模块(scipy 和 numpy):
2)对 max z=2x1+3x2-5x3 该问题确定c如下:
3) 对于不等式 2x1-5x2+x3>=10 ; x1+3x2+x3<=12
4)对于等式 x1+x2+x3=7 应该单写为:
5)对于限条件 x1,x2,x3>0 可写为:
6)求解
7)求解过程遇到的问题
完整代码如下:
求解结果如下:
总结:
一、问题
何为线性规划问题:
线性规划(Linear Programming,也称为LP)是一种运筹学技术,当当所有的目标和约束都是线性的(在变量中)并且当所有的决策变量都是连续的时使用。线性规划是最简单的运筹学方法。
例如:
二、python进行求解
这个问题必须表述为一个最小化问题。不等式必须表示为≤ 。
1.通过观察matlab解线性规划步骤进行求解
线性规划求解主要分 两个部分,目标函数(max,min)和约束条件(s.t.),求解时一般要化为MATLAB标准形式:
x = linprog(f,A,b) 求解 min f'*x 约束条件为 A*x ≤ b.
x = linprog(f,A,b,Aeq,beq) 求解上述问题,但是增加了约束条件,即将: Aeq*x = beq. 如果没有等式存在可以用:A = [] and b = []
x = linprog(f,A,b,Aeq,beq,lb,ub) 定义变量x的下界lb和上街ub,使得x始终在该范围内,即lb ≤ x ≤ ub。若没有约束条件,则设: Aeq = [] and beq = []
2.python求解步骤
1)求解用到的模块(scipy 和 numpy):
from scipy import optimize as opt
import numpy as np#引用无穷符号 inf
#from numpy import inf
2)对 max z=2x1+3x2-5x3 该问题确定c如下:
c = [2, 3, -5]
3) 对于不等式 2x1-5x2+x3>=10 ; x1+3x2+x3<=12
先将其化成 -2x1+5x2-x3<=10 ; x1+3x2+x3<=12
因为该不等式结构类似,所以写成如下:
A = np.array([[-2,5,-1],[1,3,1]])
b = np.array([-10,12])
4)对于等式 x1+x2+x3=7 应该单写为:
Aeq = np.array([[1,1,1]])
beq = np.array([7])
5)对于限条件 x1,x2,x3>0 可写为:
lim1=(0,inf)
lim2=(0,inf)
lim3=(0,inf)
#如果没有定义无穷 inf 则可写成
# lim1=(0,None)
# lim2=(0,None)
# lim3=(0,None)
6)求解
res = opt.linprog(-c,A,b,Aeq,beq,bounds=(lim1,lim2,lim3))
print(res)
7)求解过程遇到的问题
笨小孩初始求解时i,所得结果总是科学计数法,如果还有小伙伴也遇到了如下情况可以试试这些
解决方法:在导入库后,求解前写入如下代码试试
import pandas as pd
np.set_printoptions(suppress=True)
pd.set_option('display.float_format', lambda x: '%.2f' % x)
完整代码如下:
#导入包
from scipy import optimize as opt
import numpy as np
from numpy import inf# #解决结果是科学计数法的问题
# import pandas as pd
# np.set_printoptions(suppress=True)
# pd.set_option('display.float_format', lambda x: '%.2f' % x)#确定c,A,b,Aeq,beq
c = np.array([2,3,-5])
A = np.array([[-2,5,-1],[1,3,1]])
b = np.array([-10,12])
Aeq = np.array([[1,1,1]])
beq = np.array([7])
#限制
lim1=(0,None)
lim2=(0,None)
lim3=(0,None)
#求解
res = opt.linprog(-c,A,b,Aeq,beq,bounds=(lim1,lim2,lim3))
#输出结果
print(res)
求解结果如下:
重点关注的就是fun和最后一行了,fun是最优值,最后一行是每个x的最优解。
至于第一行为什么是负的呢?
原来这个函数其实是求最小值的,那么求最大值,怎么办呢?
很简单,仔细观察的人应该发现,之前的函数里面,我写的是-c,而不是c。
为什么这么写?
这是由于python库的设定。
因此这个函数的出来的结果其实就是-c的最小值,但很明显这恰恰是c最大值的相反数。那么答案就是14.5714了
总结:
经过一段时间学习,不但巩固了所学新知识,更是在实践中发现了自己的不足,真心很感谢这次机会!如有不当之处,请大家多多指点,非常感谢!!!
本次博客紧随建模学习打卡第一天_菜菜笨小孩的博客-CSDN博客