线性规划需要使用scipy模块
以及一般需要使用scipy模块中的linprog
#导入包
from scipy import optimize
import numpy as np
#确定c,A,b,Aeq,beq
c = np.array([-1,4])
A = np.array([[-3,1],[1,2]])
b = np.array([6,4])
x1_bounds=[-3,None]
#求解
res = optimize.linprog(c,A,b,bounds=(x1_bounds))
#此处使用的linprog函数,最后的bound指的是变量的范围限制,x1_bound的范围是大于等于负三。
#再者,需要将所需要满足的等式不等式均列在linprog中
print(res)
此处使用的linprog函数,最后的bound指的是变量的范围限制,x1_bound的范围是大于等于负三。再者,需要将所需要满足的等式不等式均列在linprog中
fun: -22.0
ineqlin: marginals: array([-0., -1.])
residual: array([39., 0.])
lower: marginals: array([0., 6.])
residual: array([13., 0.])
message: 'Optimization terminated successfully. (HiGHS Status 7: Optimal)'
nit: 0
slack: array([39., 0.])
status: 0
success: True
upper: marginals: array([0., 0.])
residual: array([inf, inf])
x: array([10., -3.])
我们所需要的结果只有fun和x
fun就是目标函数最小值,x就是最优解。
再举一个例子
因为方程2和方程三的不等号方向不同,所以改变不等号的方向,转换成同向的不等式,即可最终求出正确结果。
同时,在建立矩阵时,我们需要把方程右边放在一起,方程左边放在一起。(一个矩阵取得是方程左边の各个变量的系数,另外一个矩阵取得是方程右边)
#导入包
from scipy import optimize
import numpy as np
#确定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])
#求解
res = optimize.linprog(-c,A,b,Aeq,beq)
print(res)
reslult:
fun: -14.571428571428571
message: 'Optimization terminated successfully.'
nit: 2
slack: array([3.85714286, 0. ])
status: 0
success: True
x: array([6.42857143, 0.57142857, 0. ])
在求解时带入-c并且把第二个式子的系数加了负号,是因为需要化为MATLAB标准形式,最终求出来的值为最小值即-14.57,去掉负号就是我们要的最大值。