如何找到距离给定集合及其边界框最远的点

Jos*_*elo 7 algorithm math distance path

我有一个边界框,里面有许多点.我想添加另一个点,其位置距离任何先前添加的点最远,并且远离盒子的边缘.

这种事情有一个共同的解决方案吗?谢谢!

Dr.*_*ius 11

这是一个小Mathematica计划.

虽然它只有两行代码(!),但您可能需要更多的传统语言,以及能够找到最多功能的数学库.

我假设你不熟悉Mathematica,所以我会逐行解释和评论.

首先,我们在{0,1} x {0,1}中创建一个包含10个随机点的表,并将其命名为p.

p = Table[{RandomReal[], RandomReal[]}, {10}];
Run Code Online (Sandbox Code Playgroud)

现在我们创建一个最大化的函数:

f[x_, y_] = Min[ x^2, 
                 y^2, 
                 (1 - x)^2, 
                 (1 -  y)^2, 
                 ((x - #[[1]])^2 + (y - #[[2]])^2) & /@ p];  
Run Code Online (Sandbox Code Playgroud)

哈!语法变得棘手!我们来解释一下:

该函数为{0,1} x {0,1}中的任何点提供从该点到我们的集合p和边缘的最小距离.前四个术语是到边缘的距离,最后一个(难以阅读,我知道)是一个包含到所有点的距离的集合.

我们接下来要做的是最大化此功能,因此我们将得到最大距离到目标的最小距离.

但首先让我们来看看f [].如果你批判地看一下它,你会发现它不是真正的距离,而是距离的平方.我这样定义它,因为这样功能更容易最大化,结果是相同的.

另请注意,f []不是"漂亮"的功能.如果我们在{0,1}中绘制它,我们得到类似的东西:

替代文字

这就是为什么你需要一个很好的数学包来找到最大值.

Mathematica是一个非常好的包,我们可以直接最大化:

max = Maximize[{f[x, y], {0 <= x <= 1, 0 <= y <= 1}}, {x, y}];
Run Code Online (Sandbox Code Playgroud)

就是这样.最大化函数返回点,并将平方距离返回到最近的边界/点.

替代文字

HTH!如果您需要帮助翻译成另一种语言,请发表评论.

编辑

虽然我不是C#人,但在寻找SO和google搜索引用之后,来到这里:

一个候选包是DotNumerics

您应该遵循包中提供的以下示例:

 file: \DotNumerics Samples\Samples\Optimization.cs
 Example header:

  [Category("Constrained Minimization")]
  [Title("Simplex method")]
  [Description("The Nelder-Mead Simplex method. ")]
  public void OptimizationSimplexConstrained()
Run Code Online (Sandbox Code Playgroud)

HTH!

  • @Josh你有一个测试用例来尝试算法吗? (2认同)