本文简要介绍 python 语言中 scipy.optimize.milp
的用法。
用法:
scipy.optimize.milp(c, *, integrality=None, bounds=None, constraints=None, options=None)#
Mixed-integer 线性规划
解决以下形式的问题:
其中 是决策变量的向量; 、 、 、 和 是向量; 是一个矩阵, 是必须是整数的决策变量的索引集。 (在这种情况下,只能假设整数值的变量称为“integral”;它具有“integrality” 约束。)
或者,那是:
最小化:
c @ x
这样:
b_l <= A @ x <= b_u l <= x <= u Specified elements of x must be integers
默认情况下,
l = 0
和u = np.inf
除非用bounds
指定。- c: 一维密集数组
要最小化的线性目标函数的系数。 c 在问题解决之前被转换为双精度数组。
- integrality: 一维密集数组,可选
指示每个决策变量的完整性约束类型。
0
:连续变量;没有完整性约束。1
:整数变量;决策变量必须是整数界限.2
:Semi-continuous变量;决策变量必须在界限或取值0
.3
:Semi-integer变量;决策变量必须是整数界限或取值0
.默认情况下,所有变量都是连续的。在解决问题之前,完整性被转换为整数数组。
- bounds: scipy.optimize.Bounds,可选
决策变量的界限。在解决问题之前,下限和上限将转换为双精度数组。
Bounds
对象的keep_feasible
参数被忽略。如果未指定,则所有决策变量都被约束为非负数。- constraints: scipy.optimize.LinearConstraint 的序列,可选
优化问题的线性约束。参数可能是以下之一:
单个
LinearConstraint
对象可以转换为
LinearConstraint
对象的单个元组为LinearConstraint(*constraints)
完全由类型 1. 和 2 的对象组成的序列。
在问题解决之前,所有的值都被转换为双精度,约束系数的矩阵被转换为
scipy.sparse.csc_array
的实例。LinearConstraint
对象的keep_feasible
参数被忽略。- options: 字典,可选
求解器选项字典。可识别以下键。
- 显示 布尔(默认值:
False
) 如果要在优化期间将优化状态指示器打印到控制台,则设置为
True
。- node_limit 整数,可选
停止之前要求解的最大节点数(线性规划松弛)。默认没有最大节点数。
- 预解决 布尔(默认值:
True
) 预求解尝试识别琐碎的不可行性,识别琐碎的无界性,并在将问题发送给主求解器之前对其进行简化。
- time_limit 浮点数,可选
分配给解决问题的最大秒数。默认是没有时间限制。
- mip_rel_gap 浮点数,可选
MIP 求解器的终止标准:当原始目标值与双目标边界之间的差距(按原始目标值缩放)<= mip_rel_gap 时,求解器将终止。
- 显示 布尔(默认值:
- res: OptimizeResult
scipy.optimize.OptimizeResult
的一个实例。该对象保证具有以下属性。- 状态 int
一个整数,表示算法的退出状态。
0
:找到最佳解决方案。1
:达到迭代或时间限制。2
:问题不可行。3
:问题是无限的。4
:其他;详情见消息。- 成功 bool
True
当找到最佳解决方案时,False
否则。- 信息 str
算法退出状态的字符串说明符。
以下属性也将存在,但值可能是
None
,具体取决于解决方案状态。- x ndarray
在满足约束条件的同时最小化目标函数的决策变量的值。
- 乐趣 浮点数
目标函数
c @ x
的最优值。- mip_node_count int
MILP 求解器求解的子问题或“nodes” 的数量。
- mip_dual_bound 浮点数
MILP 求解器对最优解下限的最终估计。
- mip_gap 浮点数
原始目标值与双重目标界限之间的差异,按原始目标值缩放。
参数 ::
返回 ::
注意:
milp
是 HiGHS 线性优化软件 [1] 的包装。该算法是确定性的,它通常会找到中等挑战性的mixed-integer线性程序(如果存在)的全局最优值。参考:
[1]Huangfu, Q.、Galabova, I.、Feldmeier, M. 和 Hall, J. A. J.“HiGHS - 用于线性优化的高性能软件。” https://highs.dev/
[2]Huangfu, Q. 和 Hall, J. A. J. “并行化对偶修正单纯形法”。数学规划计算, 10 (1), 119-142, 2018. DOI: 10.1007/s12532-017-0130-5
例子:
考虑 https://en.wikipedia.org/wiki/Integer_programming#Example 处的问题,该问题表示为两个变量的最大化问题。由于
milp
要求将问题表示为最小化问题,因此决策变量的目标函数系数为:>>> import numpy as np >>> c = -np.array([0, 1])
注意负号:我们通过最小化目标函数的负数来最大化原始目标函数。
我们将约束的系数收集到数组中,例如:
>>> A = np.array([[-1, 1], [3, 2], [2, 3]]) >>> b_u = np.array([1, 12, 12]) >>> b_l = np.full_like(b_u, -np.inf)
由于这些约束没有下限,我们定义了一个变量
b_l
,其中充满了表示负无穷大的值。scipy.optimize.linprog
的用户可能对此不熟悉,因为它只接受A_ub @ x <= b_u
形式的 “less than”(或 “upper bound”)不等式约束。通过接受b_l <= A_ub @ x <= b_u
的b_l
和b_u
约束,milp
可以轻松地简洁地指定 “greater than” 不等式约束、“less than” 不等式约束和等式约束。这些数组被收集到单个
LinearConstraint
对象中,例如:>>> from scipy.optimize import LinearConstraint >>> constraints = LinearConstraint(A, b_l, b_u)
默认情况下强制执行决策变量的非负边界,因此我们不需要为边界提供参数。
最后,问题表明两个决策变量都必须是整数:
>>> integrality = np.ones_like(c)
我们解决这样的问题:
>>> from scipy.optimize import milp >>> res = milp(c=c, constraints=constraints, integrality=integrality) >>> res.x [1.0, 2.0]
请注意,我们是否解决了松弛问题(没有完整性约束):
>>> res = milp(c=c, constraints=constraints) # OR: >>> # from scipy.optimize import linprog; res = linprog(c, A, b_u) >>> res.x [1.8, 2.8]
我们不会通过舍入到最接近的整数来获得正确的解决方案。
本教程中给出了其他示例。
相关用法
- Python SciPy optimize.minimize_scalar用法及代码示例
- Python SciPy optimize.minimize用法及代码示例
- Python SciPy optimize.rosen_der用法及代码示例
- Python SciPy optimize.line_search用法及代码示例
- Python SciPy optimize.rosen用法及代码示例
- Python SciPy optimize.shgo用法及代码示例
- Python SciPy optimize.root用法及代码示例
- Python SciPy optimize.fmin用法及代码示例
- Python SciPy optimize.NonlinearConstraint用法及代码示例
- Python SciPy optimize.KrylovJacobian用法及代码示例
- Python SciPy optimize.toms748用法及代码示例
- Python SciPy optimize.linprog_verbose_callback用法及代码示例
- Python SciPy optimize.bracket用法及代码示例
- Python SciPy optimize.diagbroyden用法及代码示例
- Python SciPy optimize.bisect用法及代码示例
- Python SciPy optimize.isotonic_regression用法及代码示例
- Python SciPy optimize.golden用法及代码示例
- Python SciPy optimize.brute用法及代码示例
- Python SciPy optimize.newton用法及代码示例
- Python SciPy optimize.fsolve用法及代码示例
- Python SciPy optimize.Bounds用法及代码示例
- Python SciPy optimize.fixed_point用法及代码示例
- Python SciPy optimize.rosen_hess用法及代码示例
- Python SciPy optimize.nnls用法及代码示例
- Python SciPy optimize.broyden1用法及代码示例
注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.optimize.milp。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。