最小化顶点距离的算法 - 矮人要塞

时间:2014-01-23 14:36:26

标签: algorithm optimization graph graph-layout

我玩Dwarf Fortress游戏。对我来说,主要的挑战是有效地设计堡垒的布局。这意味着,每个行业流程应尽可能密集,以尽量减少行程距离。

一个例子可能是食品行业Food Industry。每个灰色椭圆代表一个建筑物。每个白色矩形代表建筑物的产品。

我的目标是找到一种算法,该算法将建筑物分布在二维网格上,使得这些建筑物之间的距离在它们连接的意义上是最小的。这意味着fisheryloom相距甚远,但loomfarmer's应该尽可能接近。

目前我已经考虑过使用一些现成的软件来模拟布局,但算法的一些技巧会很好。

目前我正在考虑一些力导向算法,但我不确定离散网格要求。

问题的形式化:是否存在一种在离散坐标下工作的强制绘制图算法?

更新:我在AS3中找到了Force draw algorithm的实现(web也包含JS版本)。我会尝试将其转换为离散版本。但我怀疑它会起作用......

更新2:评论中要求进一步限制。他们来了: 每个建筑物占据虚拟网格上的单个单元。建筑物可以在相邻的单元格上。建筑物不能堆叠/重叠。 (PS:在游戏中,每个建筑都有规模,通常为3x3,但我想让问题更加通用,以便采用更多方法)。

2 个答案:

答案 0 :(得分:9)

您正在尝试解决楼层规划问题的实例,其中您尝试最小化总“连接”长度。大多数问题都是NP难问题的实例,其中一些问题具有伪多项式运行时算法。

有一种特殊情况,您可能感兴趣的是在多项式时间内实际上是完全可解的:如果您想要放置的“盒子”或建筑物的相对位置是提前知道的。

有关如何解决这一特定案例的完整详情,请参阅斯坦福大学第6章第6.1节第6节中关于几何规划的tutorial第一个题为“平面规划”的例子。另一个website还包括实现和解决问题的matlab代码(根据第8章几何规划。)

答案 1 :(得分:1)

所以我设法做了一些代码解决了这个问题。它不是顶级产品,但它正在发挥作用。我计划随着时间的推移做一些更新,但我没有任何时间框架设置。

源代码在这里:https://github.com/sutr90/DF-Layout

我的代码使用模拟退火方法。其中成本函数基于总面积,边长和重叠的总长度。为了测量距离,我使用出租车驾驶室指标,但这是一个可以改变的主题。