我玩Dwarf Fortress游戏。对我来说,主要的挑战是有效地设计堡垒的布局。这意味着,每个行业流程应尽可能密集,以尽量减少行程距离。
一个例子可能是食品行业。每个灰色椭圆代表一个建筑物。每个白色矩形代表建筑物的产品。
我的目标是找到一种算法,该算法将建筑物分布在二维网格上,使得这些建筑物之间的距离在它们连接的意义上是最小的。这意味着fishery
和loom
相距甚远,但loom
和farmer's
应该尽可能接近。
目前我已经考虑过使用一些现成的软件来模拟布局,但算法的一些技巧会很好。
目前我正在考虑一些力导向算法,但我不确定离散网格要求。
问题的形式化:是否存在一种在离散坐标下工作的强制绘制图算法?
更新:我在AS3中找到了Force draw algorithm的实现(web也包含JS版本)。我会尝试将其转换为离散版本。但我怀疑它会起作用......
更新2:评论中要求进一步限制。他们来了: 每个建筑物占据虚拟网格上的单个单元。建筑物可以在相邻的单元格上。建筑物不能堆叠/重叠。 (PS:在游戏中,每个建筑都有规模,通常为3x3,但我想让问题更加通用,以便采用更多方法)。
答案 0 :(得分:9)
您正在尝试解决楼层规划问题的实例,其中您尝试最小化总“连接”长度。大多数问题都是NP难问题的实例,其中一些问题具有伪多项式运行时算法。
有一种特殊情况,您可能感兴趣的是在多项式时间内实际上是完全可解的:如果您想要放置的“盒子”或建筑物的相对位置是提前知道的。
有关如何解决这一特定案例的完整详情,请参阅斯坦福大学第6章第6.1节第6节中关于几何规划的tutorial第一个题为“平面规划”的例子。另一个website还包括实现和解决问题的matlab代码(根据第8章几何规划。)
答案 1 :(得分:1)
所以我设法做了一些代码解决了这个问题。它不是顶级产品,但它正在发挥作用。我计划随着时间的推移做一些更新,但我没有任何时间框架设置。
源代码在这里:https://github.com/sutr90/DF-Layout
我的代码使用模拟退火方法。其中成本函数基于总面积,边长和重叠的总长度。为了测量距离,我使用出租车驾驶室指标,但这是一个可以改变的主题。