我有 26 块六角形瓷砖。 每块瓷砖有 6 个不同的边缘。 我有一个无界的六边形网格,我可以在其中放置这些图块,并允许图块旋转。
当一个图块放置在另一个图块旁边时,会根据边缘匹配程度给出分数。 如果这有帮助,则分数始终为 0、1、2 或 3(我有一个 (26x6)x(26x6) 数组,给出每个可能的边缘匹配的分数)。 我想将瓷砖排列到网格中,以便最大化所有边缘匹配的总分。 网格中的图块形成的整体形状并不重要。
探索的方向:
我尝试创建一个 MIP 来解决整个问题。
从一个更简单的问题开始(4x4 网格中的 16 个方形瓷砖,不允许旋转),需要 15 分钟才能解决,所以我看起来 26 个旋转的六边形瓷砖不可行(我正在使用开放式求解器,无法访问 Gurobi 等)。
我考虑过动态程序,但这似乎也不可行。
在实践中,我从贪婪的方法开始,在网格中放置一个图块,然后一次不断添加一个图块。 我总是选择使分数最大化的图块/位置/旋转,然后将其固定到位并枚举添加的下一个图块,直到所有图块都已放置。
每当出现平局时,我都会随机选择(因为分数是小整数,所以有很多平局)。
随机性意味着最终得分存在很大差异,所以我只是重新运行,看看我能达到多高。
我用这种方法得到的最好成绩是 116,大约每运行 10,000 次就得到一次。
然后,我尝试了一种破坏并重新创建的变体,其中我一次构建一个图块的初始解决方案(如上所述),然后从解决方案中随机删除一定数量的图块,然后一次将它们放回一个图块中使用相同的方法。 如果这提供了更好的配置,我会切换到该配置,然后重复。 (如果新配置更差,我保留旧配置并重复)。 使用这种方法,我得到了 117 分(3 种不同的配置)。
我还尝试编写一个 MIP 来以最佳方式重新插入删除的图块,但它只适用于重新插入最多 5 个图块,这对我没有任何帮助(最初的破坏和重新创建通常会提高分数)当它删除超过 5 个图块时,它还受益于速度快,并且只是尝试多次删除不同的随机图块 - 这对于 MIP 来说是不可行的)。
还有其他我没有想到的方法,或者相关参考吗? 我尝试在网上搜索,但找不到任何对此特定问题的参考。
谢谢!
亚龙。我们可以谈谈这个游戏吗?谢谢,Yehuda([电子邮件受保护])。