scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None,
b_eq=None, bounds=None, method='highs', callback=None,
options=None, x0=None, integrality=None)
最小化受到等式和不等式制约的目标函数
官方文档的说法是这样的,给出了两种形式
形式1

形式2

我们看到,
首先,决策变量x应该使得目标函数最小化
其次,b_up代表的不等式约束向量应该在小于等于号的右边
根据官方给出的方程组形式我们可以将实际中遇到的方程组先转化为标准形式,然后利用该函数求解
接下来我们结合一个实际例子来说明各个参数的意义
假设有一个线性规划问题如下
m
a
x
z
=
x
1
−
2
x
2
−
3
x
3
{
−
2
x
1
+
x
2
+
x
3
≤
9
−
3
x
1
+
x
2
+
2
x
3
≥
4
4
x
1
−
2
x
2
−
x
3
=
−
6
x
1
≥
−
10
,
x
2
≥
0
max \ z=x_1-2x_2-3x_3\\ \left\{
将其转化为scipy中的标准形式
m
i
n
z
=
−
x
1
+
2
x
2
+
3
x
3
{
−
2
x
1
+
x
2
+
x
3
≤
9
3
x
1
−
x
2
−
2
x
3
≤
−
4
4
x
1
−
2
x
2
−
x
3
=
−
6
x
1
≥
−
10
,
x
2
≥
0
min \ z=-x_1+2x_2+3x_3\\ \left\{
该问题的解请看下面的演示程序
1-D array
线性目标函数的系数
c = [ − 1 , 2 , 3 ] c=[-1,2,3] c=[−1,2,3]
2-D array, optional
不等式约束矩阵
A = [ [ − 2 , 1 , 1 ] , [ 3 , − 1 , − 2 ] ] A=[[-2,1,1],[3,-1,-2]] A=[[−2,1,1],[3,−1,−2]]
1-D array, optional
不等式约束向量
b = [ [ 9 ] , [ − 4 ] ] b=[[9],[-4]] b=[[9],[−4]]
2-D array, optional
等式约数矩阵
A e q = [ [ 4 , − 2 , − 1 ] ] A_eq=[[4,-2,-1]] Aeq=[[4,−2,−1]]
1-D array, optional
等式约数向量
b e q = [ − 6 ] b_eq=[-6] beq=[−6]
sequence, optional
决策变量x的最大最小值
其中的每个元素都表示一个决策变量x中的最小值和最大值(min,max)
b o u n d s = ( ( 10 , N o n e ) , ( 1 , N o n e ) , ( N o n e , N o n e ) ) bounds=((10, None), (1, None), (None, None)) bounds=((10,None),(1,None),(None,None))
元组中有三个元素,分别表示 x 1 , x 2 , x 3 的最小值、最大值 x_1,x_2,x_3的最小值、最大值 x1,x2,x3的最小值、最大值
str, optional
优化算法
支持‘highs’ (default), ‘highs-ds’, ‘highs-ipm’, ‘interior-point’ (legacy), ‘revised simplex’ (legacy), and ‘simplex’ (legacy)等多种算法,其中lagacy将在scipy 1.11.0版本中被移除
callable, optional
调用回调函数
dict, optional
优化器选项字典
int
算法执行的最大迭代次数
bool,default=False
是否打印收敛消息
bool
是否自动预解析
OptimizeResult
决策结果类,包含下面变量

上图为笔者使用该函数得到的返回值,仅做参考
1-D array
使目标函数达到最佳值的决策变量的值.
float
目标函数最佳值
1-D array
不等式约束的松弛值
1-D array
等式残差约束
bool
算法成功找到最佳解决方案时返回True
int
表示算法退出状态的整数
| 0 | 成功完成优化 |
| 1 | 达到迭代限制 |
| 2 | 问题不可解 |
| 3 | 问题不收敛 |
| 4 | 数值问题 |
int
在所有阶段中执行的迭代总数
str
算法退出状态的字符串描述符
from scipy.optimize import linprog
c=[-1,2,3]
A=[[-2,1,1],[3,-1,-2]]
b=[[9],[-4]]
aeq=[[4,-2,-1]]
beq=[-6]
bounds=((-10, None), (0, None), (None, None))
res=linprog(c=c, A_ub=A, b_ub=b, A_eq=aeq, b_eq=beq, bounds=bounds,)
运行结果
