一、简介
linprog是一个优化问题的算法函数,主要用于解决线性规划问题。线性规划问题即在满足线性约束条件的前提下,求解线性函数的最小值或最大值的过程。该函数可以求解一个线性规划问题,且返回的结果可以直接使用或用于其他计算中。
二、使用
使用linprog函数通常需要传递一些参数。其中最基本的参数为c,即需要最小化或最大化的线性目标函数。还有A_ub、b_ub、A_eq、b_eq这四个参数。其中A_ub、b_ub是对代表不等式线性约束方程的矩阵和向量(即≤约束条件),而A_eq、b_eq对应代表等式约束方程的矩阵和向量。
需要注意一些参数的格式要求。例如,c参数必须是长度为N的一维向量,而不是矩阵。A_ub是m×N的矩阵,b_ub是长度为m的向量,A_eq和b_eq具有类似的格式。当然,在某些情况下,某些约束条件可以丢失或缺失。
三、样例
下面给出一个目标函数最小化的样例。该问题需要最小化3x1+4x2,约束条件为-1x1+2x2≤4、1x1+x2≤5以及x2≥-3。
from scipy.optimize import linprog
c = [-3, 4]
A = [[-1, 2], [1, 1]]
b = [4, 5]
bounds = ((None, None), (None, None))
res = linprog(c, A_ub=A, b_ub=b, bounds=bounds)
print(res)
输出结果为:
fun: -22.0
message: 'Optimization terminated successfully.'
nit: 4
slack: array([0., 0.])
success: True
x: array([2., 3.])
其中,x值表示优化的变量结果,最小值为-22。该问题实现的约束条件结果: -1(2) + 2(3) = 4和 1(2) + 1(3) = 5都满足约束条件,因此输出结果看到slack的值被设置为0。
四、注意事项
在一些问题中,A_ub向量不是完全满足“≤”的约束条件。例如A_ub可能包含多于满足线性方程组的约束,有时也可能包含不等式约束条件“A_ubx≤b_ub”中漏掉的不等式。在这种情况下,可以使用bounds参数来代替A_ub和b_ub约束条件:
bounds = [(None, None), (-3, None)]
res = linprog(c, A_ub=A, b_ub=b, bounds=bounds)
print(res)
在这个例子中,为变量x2添加下界-3,原因是这是未包含在原始A_ub和b_ub设置中的约束。
一些其他参数也可以通过传递options字典参数来设置。例如,选项中可能需要设置tol,即算法终止前的过渡容许误差,以及设置maxiter选项来限制算法的最大迭代次数。
options = {"tol": 1e-4, "maxiter": 1000}
res = linprog(c, A_ub=A, b_ub=b, bounds=bounds, options=options)
print(res)
这里展示的是调用linprog函数的基本示例。需要注意不同问题的求解方式和对各个参数的细节设置。但总的来说,linprog可以解决复杂的约束规划问题。