目标:计算两个凸多面体的交点。
我正在使用scipy.spatial.HalfspaceIntersection
来执行此操作。下图显示了相交的结果:
我的问题:确定初始可行点。
您会看到,scipy.spatial.HalfspaceIntersection
的当前Python
实现要求将interior_point
作为参数传递。
interior_point : ndarray of floats, shape (ndim,)
清楚地指向由半空间定义的区域内。也称为可行点,可以通过线性编程获得。
现在,由于我只是在起草用于HalfspaceIntersection
试验的原型,因此我现在手动提供可行的观点。
但是现在我已经不想手动指定了。
SciPy的优化模块scipy.optimize.linprog
实现了两个通用的线性编程(LP)求解器: simplex 和 interior-point 。但是,它们似乎需要成本函数。 [1]
由于我想花费尽可能少的处理时间来计算此可行点,因此我想知道如何在没有成本函数的情况下运行这些LP方法,即,仅运行至解决方案已达到可行状态。
问题:
scipy.optimize.linprog
是计算此可行内点的正确方法吗?
如果是,如何使用 simplex 或 interior-point 而没有成本函数?
< / li>为什么scipy.spatial.HalfspaceIntersection
需要首先将interior point
作为参数传递?据我所知,半空间的交集是消除给定不等式集合的冗余不等式。为什么为此需要一个可行的观点?
答案 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
。np.random.randn
)np.random.seed
)解决噪声增强LP的多个实例。由于不清楚,您的内部点的余量需要多大,我希望第二种方法(噪声增强的LP)更可靠。