飞机上的封闭点?

时间:2011-01-24 21:40:56

标签: algorithm language-agnostic packing

假设我有一个完整的,无向图G,每个边都有一个距离。具有长度l的边(u,v)的含义是“点u和v不能彼此更接近于l”。我的目标是将该图的节点放在一个平面中,这样就不会违反这些距离约束,并且这些点的凸包具有最小的总面积。举个例子,假设我有一堆电子元件要放在芯片上,每个电子元件会产生一些电气干扰。如果我将组件放得太近,它们就会开始相互干扰,使整个系统变得无用。鉴于每个点的最小距离应该来自彼此,将组件放在芯片上的最节省空间的方法是什么?

我不知道如何开始考虑这个问题。我也不知道问题可能会如何推广到更高维度的情况(将点装入超平面)。有谁知道解决这个问题的好方法?

3 个答案:

答案 0 :(得分:6)

我有一个最佳解决方案,但你不会喜欢它:)。

让我们标记节点x 0 ,x 1 ,...,x n 。设B = max i,j< n (dist(x i ,x j )),其中dist(x i ,x j )是x i 和x j 之间的最小距离。对于每个i,将节点x i 放置在位置(0,i * B)。现在每个节点距离所有其他节点至少B,并且凸包具有区域0。

这里的真正要点是,单独最小化凸包的面积将为您提供一个无意义的解决方案。一个可能更好的措施是凸壳的直径。

答案 1 :(得分:3)

我想很难找到最佳算法。如果事实证明这是一个NP难题,我不会感到惊讶。但是,如果您对能够提供合适解决方案的实用算法感兴趣,我建议您查看force-based graph drawing algorithms

这是一般的想法(会出现一些更高的数学。)。它推广到任意数量的维度。

构造一个函数f,为每个节点布局分配一个值 - 一个您想要最小化的值。在您的情况下,该函数可以计算给定布局的凸包的面积+对于未满足的每个约束的大惩罚。或者它可能是一个更简单的函数g,它合理地接近前者:简而言之,我们希望gf变小时变小,反之亦然。最好选择一个相对简单的函数,因为你需要计算它的偏导数(相对于节点的坐标)。

现在假设您有100个节点,并且您希望将它们放在3D中。这意味着您有300个未知数字(100个节点乘以每个节点3个坐标)。函数f是从 R 300 R 的函数,理想情况下我们希望找到它的全局最小值。更现实的是,足够深的局部最小值就足够了。

有众所周知的数值算法可以找到这样的最小值,例如:Conjugate gradientBFGS。好的是,你没有必要详细了解它们,这些算法是用多种语言实现的。您所要做的就是为算法请求的任何f(x)提供计算f'(x)x的方法,以及初始布局x₀

答案 2 :(得分:2)

具有额外约束的2D bin packing problem(NP难)。我听说模拟退火在电路/芯片设计方面表现相当不错。

对于looking for real-world test-data of a big bin packing problem,我实际上是Drools Planner