Algorithm 顶点距离最小化算法——矮人堡垒

Algorithm 顶点距离最小化算法——矮人堡垒,algorithm,optimization,graph,graph-layout,Algorithm,Optimization,Graph,Graph Layout,我玩游戏。我面临的主要挑战是如何有效地设计堡垒的布局。也就是说,每个产业流都应该尽可能密集,以尽量减少旅行距离 食品工业就是一个例子。每个灰色椭圆代表一座建筑。每个白色矩形代表建筑中的产品 我的目标是找到一种算法,将建筑分布在二维网格上,使这些建筑之间的距离在连接方式上最小。这意味着渔业和织机可以相隔很远,但织机和农民的应该尽可能靠近 目前,我已经考虑使用一些现成的软件来模拟布局,但是一些算法提示就可以了 目前我正在考虑一些力导向算法,但我不确定离散网格的要求 问题的形式化:是否有在离散坐标系下

我玩游戏。我面临的主要挑战是如何有效地设计堡垒的布局。也就是说,每个产业流都应该尽可能密集,以尽量减少旅行距离

食品工业就是一个例子。每个灰色椭圆代表一座建筑。每个白色矩形代表建筑中的产品

我的目标是找到一种算法,将建筑分布在二维网格上,使这些建筑之间的距离在连接方式上最小。这意味着
渔业
织机
可以相隔很远,但
织机
农民的
应该尽可能靠近

目前,我已经考虑使用一些现成的软件来模拟布局,但是一些算法提示就可以了

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

问题的形式化:是否有在离散坐标系下工作的力图绘制算法

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

更新2:评论中要求了一些进一步的限制。这是: 每个建筑占用虚拟网格上的单个单元。建筑物可以位于相邻的单元上。建筑物不能堆叠/重叠。
(注:在游戏中,每栋建筑都有指定的大小,通常为3x3,但我想让问题更一般,以允许更多的方法)。

你几乎是在试图解决一个楼层规划问题的实例,你试图最小化总“连接”长度。这些问题大多是NP难问题的实例,其中一些问题有伪多项式运行时算法

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


有关如何解决此特殊情况的详细信息,请参阅斯坦福几何编程第6章第6.1节第一个题为“楼层规划”的示例。另一个示例还包括实现和解决此问题的matlab代码(在第8章几何编程下)

因此,我已经设法编写了一些代码来近似解决这个问题。这不是一个顶级产品,但它的工作。我计划随着时间的推移做一些更新,但我没有设置任何时间框架

源代码如下:


我的代码使用模拟退火方法。其中,成本函数基于总面积、边的总长度和重叠。为了测量距离,我使用出租车公制,但这可能会发生变化。

每栋建筑是否只占用一个正方形的网格?现在你没有任何边缘长度的下限,所以最佳的解决方案是把所有的东西都叠在一起。建筑物占据3x3平方米,有几种类型的游戏网格单元大小为5x5。但为了通用性,假设每栋建筑都可以占用单个网格单元,而建筑不能堆叠。我的猜测是,问题有太多的方面,无法用现有的算法来解决。我的直觉告诉我,某种形式的模拟退火方法在这里最有效;为什么要限制为单个二维平面?那样的话,你将永远不会得到一个有竞争力的堡垒。在3d中,我们有更多的选择来寻找一种有效的排列方式。我的想法是2D意味着更少的自由度,因此更简单的算法。此外,我还习惯于在z0层建造车间,并在z+1/-1层为其储存材料。所以在飞机上的分布。我刚刚快速浏览了你们链接的文件,我认为它不会起作用。因为在我的例子中,A与B相连,不表示它们的相对位置,反之亦然。是的,但我想我在这里要说的是,除非你确定它们之间的相对位置,否则你有一个一般楼层规划的例子,这几乎保证是NP难的。这里隐含的建议是,找到一个合理的算法来预先施加相对位置,然后进行严格的优化问题。重复并继续N个这样的配置,直到达到所需的最小总连接长度。这可能会引起您的兴趣:感谢芯片设计链接。这是向正确方向的推动。关于前面建议的受限楼层规划,我想到了使用拓扑排序作为启发式。使用topo sort,应该可以识别“哪些进程可以并行运行”,例如,确定上/下关系以及哪些是串行关系,例如左/右关系。@jnovacho如果你能做到这一点,并且愿意分享你的代码,我很有兴趣看看你有什么想法。你有没有与其他方法进行过比较?这是一项很酷的研究——如果你能提高技术水平,它将成为一篇很棒的博客文章,甚至是一篇研究论文!不,不是真的。但我正在考虑这个话题的未来发展。只是现在不行。:)