使用scipy.optimize.linprog确定两个凸包是否相交

时间:2019-12-19 20:50:57

标签: linear-programming convex-hull scipy-optimize

我正在尝试找到一种有效的算法来确定两个凸包是否相交。船体由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是什么?

1 个答案:

答案 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

数值不稳定的区域是两朵云刚好接触或任意接近时,无法确切地说出它们是否重叠。在这种情况下,您会看到此算法报告“不准确”状态。在我的代码中,我选择考虑这种情况是重叠的,但是由于模棱两可,您可以自己决定要做什么。

相关问题