algorithm - 将连接的盒子放在二维平面上

标签 algorithm

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

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

当一个盒子连接到所有 N-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 减小时,该算法逐渐变为贪心优化器。您可以多次运行该算法并选择最佳结果。这是一个模拟退火方案。

关于algorithm - 将连接的盒子放在二维平面上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18439174/

相关文章:

c - 使用指针写入 strend(s, t)(检查 `s` 是否以 `t` 结尾)

c++ - 检查二叉树是否平衡

python - 使用动态规划查找 A 和 B 的最短交错字符串

algorithm - 如果删除 "LINE 3",fib(n) 需要多少次额外的函数调用?

javascript - 根据其他属性从对象数组中提取属性

java - Guice Assisted Inject 被忽略?

php - 两个日期之间的SQL存储逻辑

javascript - 填字游戏可视化工具 带方向的广度优先搜索

c++ - 在 C++ STL 中堆化?

c - 基数排序算法对于不同顺序的数据可能有不同的运行时间?