我有一个边界框和一些在其中的点。我想添加另一个点,它的位置与之前添加的点最远,并且离边框也很远。
对于这种情况是否有常见的解决方案?谢谢!
我有一个边界框和一些在其中的点。我想添加另一个点,它的位置与之前添加的点最远,并且离边框也很远。
对于这种情况是否有常见的解决方案?谢谢!
这里是一个小Mathematica程序。
虽然它只有两行代码(!),但在传统语言中你可能需要更多的代码以及能够找到函数最大值的数学库。
我假设你不熟悉Mathematica,所以我会逐行解释和注释。
首先我们创建了一个包含10个随机点的表格,该表格位于{0,1}x{0,1},并将其命名为p。
p = Table[{RandomReal[], RandomReal[]}, {10}];
f[x_, y_] = Min[ x^2,
y^2,
(1 - x)^2,
(1 - y)^2,
((x - #[[1]])^2 + (y - #[[2]])^2) & /@ p];
哈!语法变得棘手了!让我们解释一下:
该函数为您提供{0,1}x{0,1}中任何点到我们的集合p和边缘的最小距离。前四个术语是到边缘的距离,最后一个(难以阅读,我知道)是包含所有点距离的集合。
接下来我们要做的是最大化这个函数,这样我们就可以得到到我们的目标点的最小距离最大的那个点。
但首先让我们看看f[]。如果您批判性地看待它,您会发现它实际上不是距离,而是距离的平方。我这样定义它,因为这样函数更容易最大化,结果也是相同的。
还要注意,f[]不是一个“漂亮”的函数。如果我们在{0,1}中绘制它,我们会得到类似于:
因此,您需要一个好的数学包来找到最大值。
Mathematica是这样一个好的包,我们可以直接最大化它:
max = Maximize[{f[x, y], {0 <= x <= 1, 0 <= y <= 1}}, {x, y}];
就是这样。Maximize函数返回该点及其最近边界/点的平方距离。
希望对你有所帮助!如果需要翻译成其他语言,请留言。
编辑
虽然我不是C#专业人士,但在Stack Overflow和谷歌上查找参考资料后,得出以下结论:
一个候选的包是DotNumerics
你应该按照包中提供的以下示例进行操作:
file: \DotNumerics Samples\Samples\Optimization.cs
Example header:
[Category("Constrained Minimization")]
[Title("Simplex method")]
[Description("The Nelder-Mead Simplex method. ")]
public void OptimizationSimplexConstrained()
HTH!
python
实现就太好了。 - Hassan Baig