linprog(method='highs-ipm')#

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)

线性规划:使用 HiGHS 内点求解器,在受线性等式和不等式约束的情况下最小化线性目标函数。

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

\[\begin{split}\min_x \ & c^T x \\ \mbox{满足} \ & 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序列, 可选

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

method字符串

这是针对 'highs-ipm' 的方法特定文档。'highs-ipm''highs-ds''interior-point'(默认)、'revised simplex''simplex'(旧版)也可用。

返回:
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 : HiGHS 求解器遇到问题。

message字符串

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

nit整数

执行的总迭代次数。对于 HiGHS 内点法,这不包括交叉迭代。

crossover_nit整数

HiGHS 内点法的交叉例程中执行的原始/对偶推送次数。

ineqlinOptimizeResult

对应于不等式约束 b_ub 的解和敏感度信息。一个字典,包含以下字段:

residualnp.ndarray

松弛变量的(名义上为正的)值,b_ub - A_ub @ x。这个量通常也称为“松弛量”。

marginalsnp.ndarray

目标函数相对于不等式约束右侧 b_ub 的敏感度(偏导数)。

eqlinOptimizeResult

对应于等式约束 b_eq 的解和敏感度信息。一个字典,包含以下字段:

residualnp.ndarray

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

marginalsnp.ndarray

目标函数相对于等式约束右侧 b_eq 的敏感度(偏导数)。

lower, upperOptimizeResult

对应于决策变量的上下限 bounds 的解和敏感度信息。

residualnp.ndarray

x - lb(下限)或 ub - x(上限)的(名义上为正的)值。

marginalsnp.ndarray

目标函数相对于上下限 bounds 的敏感度(偏导数)。

另请参见

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

选项:
——-
maxiter整数

任一阶段中执行的最大迭代次数。对于 'highs-ipm',这不包括交叉迭代次数。默认值是平台上 int 类型可能的最大值。

disp布尔值 (默认: False)

如果在优化期间将优化状态指示器打印到控制台,则设置为 True

presolve布尔值 (默认: True)

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

time_limit浮点数

解决问题分配的最大时间(秒);默认值是平台上 double 类型可能的最大值。

dual_feasibility_tolerance双精度浮点数 (默认: 1e-07)

此值与 primal_feasibility_tolerance 中的最小值用于 'highs-ipm' 的可行性容差。

primal_feasibility_tolerance双精度浮点数 (默认: 1e-07)

此值与 dual_feasibility_tolerance 中的最小值用于 'highs-ipm' 的可行性容差。

ipm_optimality_tolerance双精度浮点数 (默认: 1e-08)

'highs-ipm' 的最优性容差。允许的最小值为 1e-12。

unknown_options字典

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

备注

方法 'highs-ipm'内点法 (interior-point method) 的 C++ 实现 [13] 的封装;它具有交叉例程,因此其精度与单纯形求解器相当。方法 'highs-ds' 是 C++ 高性能对偶修正单纯形实现 (HSOL) [13], [14] 的封装。方法 'highs' 自动在这两者之间进行选择。对于涉及 linprog 的新代码,我们建议明确选择这三种方法值之一,而不是 'interior-point'(默认)、'revised simplex''simplex'(旧版)。

结果字段 ineqlineqlinlowerupper 都包含 marginals,即目标函数相对于每个约束右侧的偏导数。这些偏导数也常被称为“拉格朗日乘数”、“对偶值”和“影子价格”。marginals 的符号约定与许多非线性求解器生成的拉格朗日乘数相反。

参考文献

[13] (1,2)

Huangfu, Q., Galabova, I., Feldmeier, M., and Hall, J. A. J. “HiGHS - high performance software for linear optimization.” https://highs.dev/

[14]

Huangfu, Q. and Hall, J. A. J. “Parallelizing the dual revised simplex method.” Mathematical Programming Computation, 10 (1), 119-142, 2018. DOI: 10.1007/s12532-017-0130-5