将连接的盒子放在2D平面上

时间:2013-08-26 07:48:52

标签: algorithm

给定N个矩形框和它们之间的M个连接,我想有效地将​​它们放在一个平面上,这样所有连接的总长度保持最小。

我唯一的经验是将平面分割成具有N个或更多空格的网格,并将这些具有最大连接数的框放置在网格中,从对角线对角空间开始。

如果有一个盒子连接到所有N-1盒子并且那些是唯一的连接,这可能效率不高。我们希望中心有一个方框,周围有所有其他方框。

是否有针对此类问题的标准解决方案?我可以获得一个关于如何解决这个问题的指针吗?

1 个答案:

答案 0 :(得分:1)

这是一个非线性优化问题,可以通过模拟退火或一般目标函数最小化(如梯度下降法)来解决。

给定框的任何布局,让L表示给定布局的所有连接的长度之和。你想最小化L.一个简单的模拟退火方案是这样的:

layout = random_layout()
t = 1.0
While(true)
  L = sum_of_lengths(layout)
  layout' = move_one_box(layout)
  L' = sum_of_lengths(layout)
  if (L' < L  or  random(0..1) < t)
    layout = layout'
  t = t * 0.999

最初,算法只是随机移动框,但是当t减小时,算法逐渐变为贪婪的优化器。您可以运行多次算法运行并选择最佳结果。这是一种模拟退火方案。