我们可以通过从所有其他点中减去 p 来假设 p = 0。那么问题是最小化有限点集(即多面体)的凸包上的范数。
关于这个问题有几篇论文。看起来像 Kazuyuki Sekitani 和 Yoshitsugu Yamamoto 的“一种用于在多面体中找到最小范数点和两个多面体中的一对最近点的递归算法”是一个很好的算法,并对问题的先前解决方案进行了简短的调查。它位于付费墙后面,但如果您可以访问大学图书馆,则可以下载副本。
他们给出的算法相当简单,一旦你通过了符号。 P 是点的有限集。 C(P) 是它的凸包。 Nr(C(P)) 是最小范数的唯一点,这就是你要找到的。
步骤 0:从有限点 P 的凸包 C(P) 中选择一个点 x_0。他们建议选择 x_0 作为 P 中具有最小范数的点。让 k=1。
现在循环:
第 1 步:设 a_k = min {x^t_{k-1} p | p 在 P} 中。这里 x^t_{k-1} 是 x_{k-1} 的转置(所以被最小化的函数只是一个点积,因为 p 范围在你的有限集 P 上)。如果|x_{k-1}|^2
第 2 步:P_k = {p | p 中的 p 和 x^t_{k-1} = a_k}。 P_k 是 P 在步骤 1 中最小化表达式的子集。在这个集合 P_k 上递归调用算法,让结果为 y_k = Nr(C(P_k))。
第 3 步:b_k = min{y^t_k p | p in P\P_k},y_k 与补集 P\P_k 中的点的点积的最小值。如果 |y_k|^2
第四步:s_k = max{s| [(1-s)x_{k-1} + sy_k]^t y_k
第 4 步中有一个明确的 s_k 公式:
s_k = min{ [x^t_{k-1} (p-y_k)]/[(y_k-x_{k-1})^t (y_k-p)] | p 在 P\P_k 和 (y_k - x_{k-1})^t (y_k-p) > 0 }
论文中有一个证明,s_k 具有必要的性质,算法在有限次数的操作后终止,结果确实是最优的。
请注意,您应该在比较中添加一些容差,否则舍入错误可能会导致算法失败。关于数值稳定性有很多讨论,详情见论文。
他们没有对算法的计算复杂度给出完整的分析,但他们确实证明了在二维情况下最多为O(m^2)(m是P中的点数),并且他们进行了数值实验,给人的印象是它在时间上是次线性的,是 m 的函数,尺寸固定。我对这种说法持怀疑态度。在没有详细分析的情况下,我建议您尝试使用典型数据进行一些实验,看看该算法对您的表现如何。