算法:找到仅由它们的分离定义的最小空间跨越点

Posted

技术标签:

【中文标题】算法:找到仅由它们的分离定义的最小空间跨越点【英文标题】:Algorithm: find minimum space spanning points defined only by their separations 【发布时间】:2021-11-16 20:44:39 【问题描述】:

我在某个 N 维空间中有一组点,我只知道它们之间的距离。假设它是一个无序的结构集合,如下所示:

struct 
    int first;         // Just some identifier that uniquely specifies a point
    int second;        // No importance to which point is first or second
    float separation;  // The distance between the first and second points -- always positive
;

当然,算法不必是 C 代码。我只是以这种风格编写了结构以使问题清晰。结构破坏了两个端点之间的对称性,这让我很不高兴,但解决这个问题只会让事情变得更加复杂。

假设间隔是由它们之间的毕达哥拉斯距离定义的,并且空间是欧几里得。让我们还指定分离是内部一致的。例如,给定 AB、BC 和 AC 分离,我们知道 AB + BC >= AC。

我想要一个算法来找到可以包含所有点的最小维度空间。在这个算法中,我们可以假设与空间定义的间隔偏差小于某个指定容差的间隔可以忽略。

有人知道这样的算法吗?到目前为止,我只能想出非多项式算法。任何人都可以对此进行改进,或者至少做出一些干净且可扩展的东西吗?

为什么这很有趣?在物理学中有一些低层次的理论,例如弦理论或量子环引力,它们并不能明显地预测我们的三维世界。该算法可以作为一个项目的一部分,以寻找如何出现 3d 世界。

【问题讨论】:

您是在寻找流形还是只寻找子空间? @collideorscape 在 2D 中,我们可以说“空间”实际上是一个“表面”吗? @colideorscape 也是,如果我理解得很好,你只有对 point 的引用吗?没有坐标?对吗? 回答其中一些问题。是的,它可以被认为是一个流形。它不一定是子空间,因为没有超空间。没有时间坐标——这是一个静态问题,因此机制无关紧要。如果您愿意,您可以将其视为刚体的顶点,尽管它只是某个空间中的点。我喜欢使用单纯形来枚举空间的想法。 (这是很多单纯形——因此是非多项式方面。)没有坐标,尽管在解决方案的过程中发明一些可能是有意义的。点仅由一个唯一的整数定义——没有别的。 【参考方案1】:

感谢所有在这里发表想法的人。我现在对自己的问题有了答案。这不是很好,因为它执行 O(n^3) 但至少它是多项式的。大致是这样工作的:

    将问题表示为对角线为零的对称矩阵——表示任意两点之间的距离。这等效于使用结构的表示,但更容易使用。

    假设矩阵隐含的点的顺序(第一列/行 = 第一个点)是合理的。 (可能值得转而寻找更好的顺序,但这是要做的。)

    现在创建一个直角坐标系来拟合点,从第一个点开始,我们以 WLOG 作为原点。

    第二个点定义 x 轴

    对于每个后续点,我们一次计算一个坐标,从 x 轴开始。我们知道到原点的距离和到点 2 的距离。这允许我们计算 x 坐标,因为我们最终得到两个联立方程 x^2 + y^2 + ... = s1^2 和 (x - x2)^2 + y^2 + ... = s2^2,这让我们可以很容易地根据 x2、点 2 的 x 坐标以及点 1 和 2、s1 和 s2 的距离来计算 x。

    每个新坐标都可以很容易地计算出来,因为到目前为止计算的坐标矩阵是三角形的——每次只有一个未知数。

    每个点的最后一个坐标位于一个新轴上——一个尚未使用的维度。使用毕达哥拉斯计算其与原点的距离的坐标,因为我们知道所有其他坐标。

    新轴上的坐标可能是虚构的——一组通用的距离不能总是用任意维数的坐标系来表示——至少不能用实数表示。如果是这种情况,我会出错。

    对每个新点继续以这种方式进行,为每个点建立一个坐标向量向量。一般来说,这是三角形的,但在某些情况下,我们计算的最终坐标足够接近零,我们认为该点的位置由现有尺寸表示。无论如何我都会存储坐标,但要保持与前一点相同的维度数。我也跳过了这些点,因为计算更多点不需要它们(参见步骤 10)。

    最后,我们已经表示了所有点,使得距离一致。

    作为最后的检查,我验证所有点的距离是否匹配,包括在步骤 9 中跳过的点。

    所需的维度数是用于最后一点的数字。

如果有人对此(在 Haskell 中)的实现感兴趣,请访问我的 GitHub 页面https://github.com/MarcusRainbow/EmergentDimensions/coords.hs。

【讨论】:

以上是关于算法:找到仅由它们的分离定义的最小空间跨越点的主要内容,如果未能解决你的问题,请参考以下文章

直线上最近的一对点

D3树垂直分离

springBoot 解决前后端分离项目中跨越请求,同源策略

支持向量机介绍

如何在线性布局中同样分离图像视图

多层感知器 - 找到“分离”曲线