我正在尝试找到一种有效的算法来确定两个凸包是否相交。船体由N维空间中的数据点组成,其中N为3到10左右。有人建议here使用scipy的linprog,这是一种优雅的算法,但是您必须在一个船体中循环所有点,结果证明该算法对于低尺寸而言非常慢(我尝试过,其中一位受访者也这样做了) )。在我看来,该算法可以概括为回答我在此处发布的问题,并且发现了我认为的解决方案here。作者说,一般的线性规划问题采用A x + t p> = 1 的形式,其中A矩阵包含都是船体, t 是一些常数> = 0,并且p = [1,1,1,1 ... 1](等同于找到A的解 x > 0 (对于某些 x )。由于我不是linprog()的新手,因此我不清楚它是否可以处理这种形式的问题。如果将A_eq定义在论文的第1页上,那么b_eq是什么?
答案 0 :(得分:0)
在this website上,用R中的算法很好地解释了如何解决此问题。我最初的帖子提到了scipy.optimize.linprog库,但是事实证明这不够可靠。我发现cvxpy库中的SCS算法工作得很好,并据此提出了以下python代码:
import numpy as np
import cvxpy as cvxpy
# Determine feasibility of Ax <= b
# cloud1 and cloud2 should be numpy.ndarrays
def clouds_overlap(cloud1, cloud2):
# build the A matrix
cloud12 = np.vstack((-cloud1, cloud2))
vec_ones = np.r_[np.ones((len(cloud1),1)), -np.ones((len(cloud2),1))]
A = np.r_['1', cloud12, vec_ones]
# make b vector
ntot = len(cloud1) + len(cloud2)
b = -np.ones(ntot)
# define the x variable and the equation to be solved
x = cvxpy.Variable(A.shape[1])
constraints = [A*x <= b]
# since we're only determining feasibility there is no minimization
# so just set the objective function to a constant
obj = cvxpy.Minimize(0)
# SCS was the most accurate/robust of the non-commercial solvers
# for my application
problem = cvxpy.Problem(obj, constraints)
problem.solve(solver=cvxpy.SCS)
# Any 'inaccurate' status indicates ambiguity, so you can
# return True or False as you please
if problem.status == 'infeasible' or problem.status.endswith('inaccurate'):
return True
else:
return False
cube = np.array([[1,1,1],[1,1,-1],[1,-1,1],[1,-1,-1],[-1,1,1],[-1,1,-1],[-1,-1,1],[-1,-1,-1]])
inside = np.array([[0.49,0.0,0.0]])
outside = np.array([[1.01,0,0]])
print("Clouds overlap?", clouds_overlap(cube, inside))
print("Clouds overlap?", clouds_overlap(cube, outside))
# Clouds overlap? True
# Clouds overlap? False
数值不稳定的区域是两朵云刚好接触或任意接近时,无法确切地说出它们是否重叠。在这种情况下,您会看到此算法报告“不准确”状态。在我的代码中,我选择考虑这种情况是重叠的,但是由于模棱两可,您可以自己决定要做什么。