594. Santa 2023 - The Polytope Permutation Puzzle | santa-2023
本文概述了我们获得25名的解决方案思路。
首先感谢@codicon、@timothygao、@alvaroborras和@marksix在整个比赛期间的团队合作和贡献,也感谢Kaggle组织这次比赛。
最初我们使用了公开代码库:DWalton处理棱块,RCube处理中心块。AB型魔方使用了奇偶性技巧。仅这些就让我们在281和282题上获得了23k分,并在比赛一周后获得了614k分的第三名成绩。然而,它无法解决N型魔方。
N型魔方更具挑战性。我们首先尝试像普通魔方一样解决它,通过重新着色(例如,对于4/4/4魔方,将N1到N16标记为A,N17到N32标记为B等)。解决后,我们注意到魔方的棱块已经完全解决,只剩下中心块。这让我们想到了使用魔方 commutators 的方法。
例如,以蓝色下划线的方块为例。每个面有4个这样的方块,整个魔方共有24个。绿色下划线的方块同理。仅针对中心块,魔方可以简化为解决多个24个小方块的子问题。
我们首先尝试使用双向BFS解决子问题,但这太慢不可行,因此改用束搜索(beam search)。束搜索帮助我们将283题从108k步减少到27k步,并略微改善了其他魔方。
最终方案:使用DWalton求解器解决棱块(奇数N的最中心方块),然后对commutators执行束搜索解决中心块。
所有魔方总分:约132k
初始构造性方案
为进一步改进大型地球仪,我们实现了Minkwitz算法的修改版本。原始Minkwitz算法论文可在这里找到,来自该论文的术语将使用"引号"标注。
主要差异如下:
起初我们尝试贪心"base"选择,但这导致短期收益以增加后期"table"条目的"word"长度呈指数级增长为代价。最佳base是逐列迭代、每列从底到顶时的元素(我们尝试过之字形交替顶底迭代,但效果更差,可能因为缺乏顺序性)。
实现方面,我们使用C++以获得最大速度。此外,我们实现了原地置换操作(如逆操作)以避免内存分配(3倍加速)。
表填充执行到表似乎收敛为止,超参数表示法为:(轮次, 改进轮次("s"), max_start_word_length, 快速改进或论文改进)。我们后期切换到论文的Improve是因为它尝试更多现有短词组合,这在发现新的短词变得越来越困难时是必要的。
| 地球仪类型 | 参数配置 | 运行时间 |
|---|---|---|
| 3/33 | (1e9, 1e6, 4, 快速改进) | 2小时 |
| (1e8, 1e6, 32, 论文改进) | 3小时 | |
| (1e8, 1e6, 8, 论文改进) | 2小时 | |
| 8/25 | (4e8, 1e6, 4, 快速改进) | 2小时 |
| (3e7, 1e6, 32, 快速改进) | 20分钟 | |
| (1e8, 1e6, 32, 论文改进) | 4小时 | |
| (1e8, 1e6, 8, 论文改进) | 2小时 | |
| 其他地球仪 | (1e9, 1e5, 8, 快速改进) | < 2小时 |
填充表格后,可通过因式分解快速确定解决方案,因此我们再次使用随机化。在因式分解前,我们对8/25和3/33应用1-16次随机初始移动,对其余应用1-8次。每道谜题使用约1e7次运行,大大减少了移动步数(例如3/4减少约70%,8/25和3/33减少约20%)。
该算法解决每个3/33约需1700步,每个8/25约需2500步。
所有地球仪总分:约26k
我们发现Glazed公开的爬山算法Notebook非常有用。它改善了几乎所有花环,经过多次运行和一些代码修改后,将100/100花环减少到2500步。
所有花环总分:约3.6k