linprog(method='highs')#

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’ 的特定方法文档,它在 ‘highs-ds’‘highs-ipm’ 之间自动选择。 ‘interior-point’ (默认), ‘修订单纯形法’, 和 ‘单纯形法’ (遗留) 也可用。

integrality一维数组或整数,可选

指示每个决策变量的积分约束类型。

0 : 连续变量;没有积分约束。

1 : 整数变量;决策变量必须是 bounds 内的整数。

2 : 半连续变量;决策变量必须在 bounds 内或取值 0

3 : 半整数变量;决策变量必须是 bounds 内的整数或取值 0

默认情况下,所有变量都是连续的。

对于混合积分约束,请提供形状为 c.shape 的数组。要从较短的输入推断每个决策变量的约束,该参数将使用 np.broadcast_to 广播到 c.shape

此参数当前仅由 'highs' 方法使用,否则将被忽略。

返回:
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 单纯形法,这包括所有阶段的迭代。对于 HiGHS 内点法,这不包括交叉迭代。

crossover_nit整数

对于 HiGHS 内点法,在交叉例程期间执行的原始/对偶推送的次数。对于 HiGHS 单纯形法,这是 0

ineqlinOptimizeResult

与不等式约束 b_ub 相对应的解和敏感度信息。一个由以下字段组成的字典

residualnp.ndnarray

松弛变量的(名义上为正)值,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

选项:
——-
maxiterint

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

dispbool (default: False)

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

presolvebool (default: True)

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

time_limitfloat

解决问题的最大时间(以秒为单位);默认值是平台上 double 的最大可能值。

dual_feasibility_tolerancedouble (默认值:1e-07)

‘highs-ds’ 的对偶可行性容差。此值和 primal_feasibility_tolerance 中的最小值用于 ‘highs-ipm’ 的可行性容差。

primal_feasibility_tolerancedouble (默认值:1e-07)

‘highs-ds’ 的原始可行性容差。此值和 dual_feasibility_tolerance 中的最小值用于 ‘highs-ipm’ 的可行性容差。

ipm_optimality_tolerancedouble (默认值: 1e-08)

‘highs-ipm’ 的最优性容差。允许的最小值是 1e-12。

simplex_dual_edge_weight_strategystr (默认值:None)

单纯形对偶边权重的策略。默认值 None 会自动选择以下策略之一。

'dantzig' 使用 Dantzig 的原始策略,选择最负的约简成本。

'devex' 使用 [15] 中描述的策略。

steepest 使用 [16] 中描述的精确最陡边策略。

'steepest-devex' 以精确最陡边策略开始,直到计算过于昂贵或不精确,然后切换到 devex 方法。

目前,None 始终选择 'steepest-devex',但随着新选项的出现,这可能会发生变化。

mip_rel_gapdouble (默认值:None)

MIP 求解器的终止标准:当原始目标值和对偶目标边界之间的差距(按原始目标值缩放)<= mip_rel_gap 时,求解器将终止。

unknown_optionsdict

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

说明

方法 ‘highs-ds’ 是 C++ 高性能对偶修正单纯形实现 (HSOL) 的包装器 [13], [14]。方法 ‘highs-ipm’ 是 C++ 实现的包装器 [13];它具有交叉例程,因此它与单纯形求解器一样准确。方法 ‘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

[15]

Harris, Paula MJ. “Pivot selection methods of the Devex LP code.” Mathematical programming 5.1 (1973): 1-28.

[16]

Goldfarb, Donald, and John Ker Reid. “A practicable steepest-edge simplex algorithm.” Mathematical Programming 12.1 (1977): 361-371.