如何在Python中快速获得可行的线性程序解决方案?

时间:2018-07-30 16:22:44

标签: 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,)
  清楚地指向由半空间定义的区域内。也称为可行点,可以通过线性编程获得。

现在,由于我只是在起草用于HalfspaceIntersection试验的原型,因此我现在手动提供可行的观点。 但是现在我已经不想手动指定了。

SciPy的优化模块scipy.optimize.linprog实现了两个通用的线性编程(LP)求解器: simplex interior-point 。但是,它们似乎需要成本函数。 [1]

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

问题:

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

  2. 如果是,如何使用 simplex interior-point 而没有成本函数?

    < / li>
  3. 为什么scipy.spatial.HalfspaceIntersection 需要首先将interior point作为参数传递?据我所知,半空间的交集是消除给定不等式集合的冗余不等式。为什么为此需要一个可行的观点?

1 个答案:

答案 0 :(得分:1)

您可以指定恒定成本函数,例如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)更可靠。