优化包含给定点集的网格间距

时间:2011-01-15 23:32:44

标签: algorithm optimization geometry grid computational-geometry

我试图在标题中尽可能地总结这一点。我正在以最一般的方式编写初始值问题解决方案。我从任意位置(边界内)开始任意数量的初始值。我的程序的第一部分创建一个网格/网格(我不确定哪个是正确的细微差别),总共N个点,包含所有初始值。我的目标是优化网格,使间距尽可能均匀。我的求解器看起来工作得不太合适(它需要一些更模糊的调试,这在这里不相关。)

我从一个维度开始。一旦我使算法一致地工作,我打算将算法推广到任意数量的维度。我正在用fortran编写我的代码,但可以随意使用伪代码或您选择的语言进行回复。

请允许我举例说明:
假设我正在关闭一段时间[1,10]

xmin=1  
xmax=10 

假设我有3个初始点:xmin,5和xmax

num_ivc=3  
known(num_ivc)=[xmin,5,xmax] //my arrays start at 1. Assume "known" starts sorted

我将网格/网格点存储在名为coord的数组中。假设我的网格/网格中总共需要10个点。

N=10  
coord(10)  

请记住,所有这些都是随意的 - 当然除了变量名称。 该算法应将coord设置为{1,2,3,4,5,6,7,8,9,10}

现在换一个不太重要的例子:

num_ivc=3  
known(num_ivc)=[xmin,5.5,xmax  
or just  
num_ivc=1  
known(num_ivc)=[5.5]   

现在,你会在间隔[5.5,5]上有5个均匀间隔的点,并且在间隔(5.5,10)上有5个均匀间隔的点吗?但是1到5.5之间的空间比5.5到10之间的空间大。所以你会在[1,5.5]上有6分,然后是4分(5.5到10分)。关键是要尽量减少间距差异。

我已经连续工作了2天,我可以向你保证这比听起来要复杂得多。我写了代码

only works if N is large
only works if N is small
only works if it the known points are close together
only works if it the known points are far apart
only works if at least one of the known points is near a boundary
only works if none of the known points are near a boundary

正如你所看到的,我编写了几乎所有解决方案的代码。我无法想办法让它在所有可能的情况下都能很好地运行(即创建最佳间距。)

1 个答案:

答案 0 :(得分:1)

您的初始点定义了多个区间,其长度为(例如)a1,a2,...,ak。你要把它们分成(比方说)m1,m2,...,mk子区间。显然你想要在每个区间内等间距,所以你将拥有长度为a1 / m1的m1子区间,然后是长度为a2 / m2的m2,等等。

现在,当然你还没有定义“最佳间距”,并且可能没有任何一种真正的方法来定义它,但我们将它的意思是“最小化子区间长度的平方和”。 (简单的练习:当你只有一个间隔时,这确实给你一个相等的细分。)然后你的目标是最小化a1 ^ 2 / m1 + ... + ak ^ 2 / mk,约束为m1 +。 .. + mk是固定的,m都是正整数。

不幸的是,离散优化很难。如果你让m不断变化,答案是什么?不出所料,m应该与a成正比。这是一个应该做得很好的简单方法(我猜你不是严格要求最佳解决方案)。

  1. 通过简单地将“连续”解决方案四舍五入到最接近的整数来计算初始猜测。那就是:如果你的目标是总共M + 1个点,因此M个子区间,取mj = round(M * aj / s),其中s = a1 + ... + ak。
  2. 不幸的是,除非你碰巧幸运,否则这不会给你正确的m1 + ... + mk值。所以现在通过向其中一些添加1(如果你得分太少)或从其中一些减去1(如果你有太多)来解决这个问题。比如说,按照舍入产生的错误的顺序执行此操作;也就是说,按M * aj / s的顺序 - 舍入(M * aj / s)。 (增加或减少顺序取决于你的m1 + ... + mk错误的方向。)
  3. 我在这里做的假设可能是也可能不正确,即你想要的是“所有相等长度的间隔,尽可能接近”,而不是“相等长度的相邻间隔,如近尽可能“。 (测试用例:假设你试图用9个内部点细分间隔[0,1],你必须将其中一个用0.001分。你是否在0.001和1之间等间隔0,0.001和8个点,或者你真的希望它们在0.001附近间隔更近吗?)如果它是你想要的后者,那么事情会变得更有趣,也更困难。

    并提醒一句:不要指望你在一个维度上做的任何事情要巧妙地概括,以便在更多维度上提供更好的东西。在大于1的维度中,您可能不仅需要一组点,而且需要类似三角测量的东西,以及(1)具有比您的一维设置更多的结构和(2)您想要的条件三角形更复杂 - 例如,你可能不会只关心尺寸;你也希望他们不要太长和太瘦。