python - Python中如何快速得到线性规划的可行解?

标签 python numpy scipy computational-geometry linear-programming

目标:计算两个凸多胞形的交集。

我正在使用 scipy.spatial.HalfspaceIntersection去做这个。下图显示了生成的交叉点:rviz-screenshot

我的问题:确定一个初始可行点。

你看,scipy.spatial.HalfspaceIntersection 的当前 Python 实现需要将 interior_point 作为参数传递。

interior_point : ndarray of floats, shape (ndim,)
Point clearly inside the region defined by halfspaces. Also called a feasible point, it can be obtained by linear programming.

现在,我正在手动提供可行点,因为我只是在起草一个原型(prototype)来试验 HalfspaceIntersection。 但现在我已经到了不想手动指定它的地步。

SciPy的优化模块 scipy.optimize.linprog实现两个通用的线性规划 (LP) 求解器:单纯形内点。但是,它们似乎需要成本函数。 [ 1 ]

因为我想花费尽可能少的处理时间来计算这个可行点,所以我想知道如何在没有成本函数的情况下运行这些 LP 方法,即只运行直到该解决方案已达到可行状态。

问题:

  1. scipy.optimize.linprog 是计算这个可行内点的正确方法吗?

  2. 如果是,我如何使用 simplexinterior-point 没有成本函数?

  3. 为什么 scipy.spatial.HalfspaceIntersection 要求首先将一个内部点作为参数传递?据我所知,半空间的交集是删除一组给定不等式的冗余不等式。为什么需要可行点?

最佳答案

您可以指定一个常数成本函数,例如 0。

这是一个例子:

%pylab
from scipy.optimize import linprog
A = array([[1] + 9 * [0], 9 * [0] + [1]])
b = array([1, 1])

测量这种方法的性能表明它非常有效:

%time
res = linprog(c=zeros(A.shape[1]), A_eq=A, b_eq=b)

输出:

CPU times: user 5 µs, sys: 1 µs, total: 6 µs
Wall time: 11 µs

此外,根据 res.nit,我们仅在 2 次迭代后就完成了。

结果res.x是正确的:

array([ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.])

请注意,单纯形算法旨在查找由线性约束定义的多面体的顶点。据我了解,基于内部点的方法没有这样的偏好,尽管我不熟悉 scipy 的 linprog 背后的实现。因此,由于您的要求是该点“明显位于半空间定义的区域内”,因此我建议采用以下方法之一:

  • 或者,method='interior-point' 传递给 linprog
  • 或者,计算不同的顶点并利用多面体是凸的:
    1. 向常量目标函数添加一些噪声(例如,通过 np.random.randn)
    2. 通过改变噪声种子 (np.random.seed) 解决噪声增强 LP 的多个实例。
    3. 最后,使用您的解决方案的平均值作为最终内部点“明显位于区域内”

由于不清楚您的内部点的边距需要多大,我希望第二种方法(噪声增强 LP)更稳健。

关于python - Python中如何快速得到线性规划的可行解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51598353/

相关文章:

javascript - 错误 : spawn EACCES in ubuntu for node. js/express 应用程序尝试运行 python

python - 用python编写的端口扫描仪无法正常显示输出

python - 在 PIL 中,为什么不转换 ('L' ) 转换图像灰度?

python - 返回 xy 坐标的 z 值

python - 如何为 Ironpython27 安装 numpy 和 scipy?

Python:仅在图像蒙版内执行模糊

python - Python 中的清理嵌套列表

python - 在 Python pandas 中拆分和连接数据帧以使用 rpy2 进行绘图

python - 简化 numpy argmin 的愚蠢循环

python - 数据框到 file.txt python