linprog(method=’interior-point’)#

scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=(0, None), method='highs', callback=None, options=None, x0=None, integrality=None)

线性规划:使用[4]的内点法,在满足线性等式和不等式约束的条件下,最小化线性目标函数。

自 1.9.0 版本起已弃用:method=’interior-point’ 将在 SciPy 1.11.0 中移除。它已被 method=’highs’ 取代,因为后者更快更健壮。

线性规划解决以下形式的问题

\[\begin{split}\min_x \ & c^T x \\ \mbox{such that} \ & A_{ub} x \leq b_{ub},\\ & A_{eq} x = b_{eq},\\ & l \leq x \leq u ,\end{split}\]

其中 \(x\) 是决策变量向量;\(c\)\(b_{ub}\)\(b_{eq}\)\(l\)\(u\) 是向量;\(A_{ub}\)\(A_{eq}\) 是矩阵。

或者,即

最小化

c @ x

满足

A_ub @ x <= b_ub
A_eq @ x == b_eq
lb <= x <= ub

请注意,除非通过 bounds 指定,否则默认情况下 lb = 0ub = None

参数:
c一维数组

要最小化的线性目标函数的系数。

A_ub二维数组,可选

不等式约束矩阵。 A_ub 的每一行指定了 x 上的线性不等式约束的系数。

b_ub一维数组,可选

不等式约束向量。每个元素表示 A_ub @ x 对应值的上限。

A_eq二维数组,可选

等式约束矩阵。 A_eq 的每一行指定了 x 上的线性等式约束的系数。

b_eq一维数组,可选

等式约束向量。 A_eq @ x 的每个元素必须等于 b_eq 的对应元素。

bounds序列,可选

一个包含 (min, max) 对的序列,用于 x 中的每个元素,定义该决策变量的最小值和最大值。使用 None 表示没有边界。默认情况下,边界为 (0, None)(所有决策变量均为非负)。如果提供单个元组 (min, max),则 minmax 将作为所有决策变量的边界。

method字符串

这是针对‘interior-point’方法的文档。‘highs’‘highs-ds’‘highs-ipm’‘revised simplex’‘simplex’(旧版)也可用。

callback可调用对象,可选

每次迭代执行一次的回调函数。

返回:
resOptimizeResult

一个包含以下字段的 scipy.optimize.OptimizeResult 对象

x一维数组

使目标函数最小化并满足约束的决策变量值。

fun浮点数

目标函数 c @ x 的最优值。

slack一维数组

松弛变量(名义上为正)的值,即 b_ub - A_ub @ x

con一维数组

等式约束的(名义上为零)残差,即 b_eq - A_eq @ x

success布尔值

当算法成功找到最优解时为 True

status整数

表示算法退出状态的整数。

0 : 优化成功终止。

1 : 达到迭代限制。

2 : 问题似乎不可行。

3 : 问题似乎无界。

4 : 遇到数值困难。

message字符串

算法退出状态的字符串描述。

nit整数

在所有阶段执行的总迭代次数。

另请参阅

有关其余参数的文档,请参阅 scipy.optimize.linprog

选项:
——-
maxiter整数(默认值:1000)

算法的最大迭代次数。

disp布尔值(默认值:False)

如果每次迭代都要将优化状态指示器打印到控制台,则设置为 True

presolve布尔值(默认值:True)

预求解(Presolve)尝试在将问题发送到主求解器之前识别微不足道的不可行性、微不足道的无界性并简化问题。通常建议保留默认设置 True;如果需要禁用预求解,则设置为 False

tol浮点数(默认值:1e-8)

用于所有终止条件的终止容差;请参阅 [4] 第 4.5 节。

autoscale布尔值(默认值:False)

设置为 True 以自动执行平衡。如果约束中的数值相差几个数量级,请考虑使用此选项。

rr布尔值(默认值:True)

设置为 False 以禁用自动冗余移除。

alpha0浮点数(默认值:0.99995)

Mehrota 预测-校正搜索方向的最大步长;请参阅 [4] 表 8.1 中的 \(\beta_{3}\)

beta浮点数(默认值:0.1)

当 Mehrota 的预测-校正器未在使用时(不常见),路径参数 \(\mu\)(参阅 [6])的预期减少量。

sparse布尔值(默认值:False)

如果在预求解后问题被视为稀疏的,则设置为 True。如果 A_eqA_ub 是稀疏的,则此选项将自动设置为 True,并且即使在预求解期间,问题也将被视为稀疏的。如果您的约束矩阵大部分为零且问题不太小(约束或变量少于约 100 个),请考虑设置为 True 或将 A_eqA_ub 作为稀疏数组提供。

lstsq布尔值(默认值:False

如果预计问题条件非常差,则设置为 True。除非遇到严重的数值困难,否则应始终保持为 False。除非您收到警告消息建议更改,否则请保持此默认设置。

sym_pos布尔值(默认值:True)

如果问题预计会产生一个条件良好的对称正定正规方程矩阵(几乎总是如此),则保持为 True。除非您收到警告消息建议更改,否则请保持此默认设置。

cholesky布尔值(默认值:True)

如果正规方程要通过显式 Cholesky 分解和随后的显式前向/后向代入来求解,则设置为 True。这对于数值行为良好的问题通常更快。

pc布尔值(默认值:True)

如果要使用 Mehrota 的预测-校正方法,则保持为 True。这几乎总是(如果不是总是)有益的。

ip布尔值(默认值:False)

如果需要 [4] 第 4.3 节中提到的改进的初始点建议,则设置为 True。这是否有益取决于具体问题。

permc_spec字符串(默认值:‘MMD_AT_PLUS_A’)

(仅在 sparse = Truelstsq = Falsesym_pos = True 且没有 SuiteSparse 的情况下有效。)算法的每次迭代中都会对矩阵进行因式分解。此选项指定如何置换矩阵的列以保持稀疏性。可接受的值为:

  • NATURAL: 自然顺序。

  • MMD_ATA: 基于 A^T A 结构的最小度排序。

  • MMD_AT_PLUS_A: 基于 A^T+A 结构的最小度排序。

  • COLAMD: 近似最小度列排序。

此选项会影响内点算法的收敛性;请测试不同的值以确定哪个对您的问题表现最佳。更多信息请参考 scipy.sparse.linalg.splu

unknown_options字典

此特定求解器未使用的可选参数。如果 unknown_options 非空,则会发出警告,列出所有未使用的选项。

备注

此方法实现了 [4] 中概述的算法,结合了 [8] 的思想,并受到 [6] 中更简单方法的启发。

原对偶路径跟踪方法从标准形式问题的原变量和对偶变量的初始“猜测”开始,并迭代尝试求解添加了逐渐减小的对数障碍项到目标函数中的(非线性)Karush-Kuhn-Tucker 条件。此特定实现使用同构自对偶公式,在适用情况下提供不可行或无界的证明。

原变量和对偶变量的默认初始点是 [4] 第 4.4 节公式 8.22 中定义的。可选地(通过设置初始点选项 ip=True),可以根据 [4] 第 4.4 节的其他建议计算备用(可能改进的)起点。

搜索方向使用 Mehrota 提出的预测-校正方法(单次校正)计算,详细信息请参阅 [4] 第 4.1 节。(一个潜在的改进是实现 [4] 第 4.2 节中描述的多重校正方法。)实际上,这是通过求解正规方程来实现的,即 [4] 第 5.1 节公式 8.31 和 8.32,这些方程源自牛顿方程 [4] 第 5 节公式 8.25(与 [4] 第 4 节公式 8.6-8.8 比较)。求解正规方程而不是直接求解 8.25 的优点是所涉及的矩阵是对称正定的,因此可以使用 Cholesky 分解而不是更昂贵的 LU 分解。

在默认选项下,用于执行因式分解的求解器取决于第三方软件的可用性和问题的条件。

对于稠密问题,求解器按以下顺序尝试

  1. scipy.linalg.cho_factor

  2. scipy.linalg.solve,选项为 sym_pos=True

  3. scipy.linalg.solve,选项为 sym_pos=False

  4. scipy.linalg.lstsq

对于稀疏问题

  1. sksparse.cholmod.cholesky(如果安装了 scikit-sparse 和 SuiteSparse)

  2. scipy.sparse.linalg.factorized(如果安装了 scikit-umfpack 和 SuiteSparse)

  3. scipy.sparse.linalg.splu(使用 SciPy 分发的 SuperLU)

  4. scipy.sparse.linalg.lsqr

如果求解器因任何原因失败,将按照指示的顺序尝试更健壮(但更慢)的求解器。尝试、失败和重新开始因式分解可能耗时,因此如果问题在数值上具有挑战性,可以设置选项以绕过失败的求解器。将 cholesky=False 设置为跳到求解器 2,将 sym_pos=False 跳到求解器 3,将 lstsq=True 跳到求解器 4,这适用于稀疏和稠密问题。

[4] 第 5.3 节和 [10] 第 4.1-4.2 节概述了解决稀疏问题中与稠密列相关问题的潜在改进;后者还讨论了缓解与自由变量的替换方法相关的精度问题。

在计算搜索方向后,计算出不激活非负约束的最大可能步长,并应用该步长与单位(1)中较小的一个(如 [4] 第 4.1 节所述)。[4] 第 4.3 节建议了选择步长的改进方法。

新点根据 [4] 第 4.5 节的终止条件进行测试。所有检查都使用相同的容差,该容差可以通过 tol 选项设置。(一个潜在的改进是允许独立设置不同的容差。)如果检测到最优性、无界性或不可行性,求解过程终止;否则重复。

尽管顶层 linprog 模块期望以下形式的问题

最小化

c @ x

约束条件

A_ub @ x <= b_ub
A_eq @ x == b_eq
 lb <= x <= ub

其中,除非在 bounds 中设置,否则 lb = 0ub = None。问题会自动转换为以下形式

最小化

c @ x

约束条件

A @ x == b
    x >= 0

以供求解。也就是说,原始问题包含等式、上限和变量约束,而特定方法求解器要求等式约束和变量非负性。linprog 通过将简单边界转换为上限约束,为不等式约束引入非负松弛变量,并将无界变量表示为两个非负变量之间的差,从而将原始问题转换为标准形式。在报告结果之前,问题会转换回原始形式。

参考文献

[4] (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)

Andersen, Erling D., and Knud D. Andersen。“The MOSEK interior point optimizer for linear programming: an implementation of the homogeneous algorithm。”《High performance optimization》。Springer US, 2000. 197-232。

[6] (1,2)

Freund, Robert M. “Primal-Dual Interior-Point Methods for Linear Programming based on Newton’s Method。” 未发表课程笔记,2004 年 3 月。2017 年 2 月 25 日可于 https://ocw.mit.edu/courses/sloan-school-of-management/15-084j-nonlinear-programming-spring-2004/lecture-notes/lec14_int_pt_mthd.pdf 查阅

[8]

Andersen, Erling D., and Knud D. Andersen。“Presolving in linear programming。”《Mathematical Programming》71.2 (1995): 221-245。

[9]

Bertsimas, Dimitris, and J. Tsitsiklis。“Introduction to linear programming。”Athena Scientific 1 (1997): 997。

[10]

Andersen, Erling D., 等。Implementation of interior point methods for large scale linear programming。HEC/Universite de Geneve, 1996。