返回列表

11th place solution

638. Santa 2024 - The Perplexity Permutation Puzzle | santa-2024

开始: 2024-11-21 结束: 2025-01-31 自然语言处理 数据算法赛
第 11 名解决方案

第 11 名解决方案

作者: Ryota (Grandmaster)
发布日期: 2025-02-01
竞赛排名: 第 11 名

引言

感谢组织者举办了如此激动人心的比赛。我也想向其他参与者表达谢意。在比赛的最后阶段,大家一起争夺金牌的过程非常刺激,也是一段愉快的经历。我从 Notebooks 和讨论区中学到了很多,这对取得这个结果有很大的帮助。非常感谢。

总结

我的改进始于一个公开分享的提交文件,其得分为 250.10105,分享于此笔记本。因此,ID=0,1,2 已经在排行榜上达到了最优解,我只需要处理 ID=3,4,5。这让我能够节省计算资源用于探索。感谢 @veniaminnelin 分享了这个笔记本。我也想对这个笔记本所引用的笔记本作者表示感谢。

我所有的解决方案完全依赖于模拟退火(Simulated Annealing),而如何生成邻域解是一个关键因素。我将在下面详细描述。

生成邻域解

由于使用“交换(swap)”会相对破坏原始解,因此选择“插入(insert)”作为生成邻域解的方法是改进的起点。
我使用的方法如下:

1. 随机插入 (random insert)

  • 随机选择 i 和 j (0 ≤ i, j < len(words)),然后将位置 i 的单词插入到位置 j。
  • 用于 ID-3, 5。

2. 基于距离的概率插入 (distance-based probabilistic insert)

  • 随机选择 i (0 ≤ i < len(words))。然后,基于与 i 的距离,概率性地选择 j 作为插入位置,并将位置 i 的单词插入到位置 j。
  • 公式:
  • dj = |i - j|,   p(j) = (1/dj) / ∑j(1/dj)
  • 用于 ID-4, 5。

3. 变长随机插入 (variable-length random insert)

  • 一种将随机插入修改为变长方法的方法。
  • 长度值根据以下概率分布确定:
    • p(L=1) = 0.4, p(L=2) = 0.3, p(L=3) = 0.2, p(L=4) = 0.1
  • 用于 ID-5。

4. 字母顺序插入 (alphabetical insert)

  • 随机选择 i (0 ≤ i < len(words))。然后,从首字母与单词 i 相同的单词组中随机选择一个,并将单词 i 插入到所选单词之前或之后。
  • 用于 ID-5。

5. 部分排列 (partial permutation)

  • 随机选择 i (0 ≤ i < len(words) - L + 1),并将起始于 i 的长度 L(=4) 的单词序列进行排列作为邻域解。
  • 用于 ID-5。

细节

ID-3

  • 对于 ID-3,我没有使用公开笔记本中的解作为初始解,而是从随机顺序初始化的序列开始。
  • 通过使用上述的随机插入方法,经过几次运行后,我达到了 197.5 的分数。
  • 然而,正如讨论区所指出的,这是一个已知的局部最优解,很难跳出。
  • 为了跳出局部最优,我尝试固定第一个单词并应用随机插入。通过将"magi"作为第一个单词,我成功跳出了局部最优,达到了 191.7 分。
  • 参数:
    • 每次运行迭代次数 (n_iterations):100,000
    • 冷却计划 (Cooling Schedule):线性递减 (Linear Decrease)
    • 初始温度 (start_temp):10
    • 结束温度 (end_temp):0.1
    • 批大小 (batch_size):8, 16, 32

ID-4

  • 在这三个 ID 中,ID-4 相对容易。通过使用公开笔记本分享的解作为初始解,并应用基于距离的概率插入,我能够在一次运行中达到 67.54 分。
  • 参数:
    • 每次运行迭代次数 (n_iterations):100,000
    • 冷却计划 (Cooling Schedule):线性递减 (Linear Decrease)
    • 初始温度 (start_temp):2
    • 结束温度 (end_temp):0.1
    • 批大小 (batch_size):32

ID-5

  • 与 ID-4 一样,我使用公开笔记本中的解作为初始解,并尝试基于距离的概率插入,将分数提高到了 31.66。
  • 接下来,使用 31.66 的解作为初始解,我运行了几次搜索,结合了随机插入、基于距离的概率插入、字母顺序插入和部分排列,最终将分数提高到了 30.70。
  • 在检查此时的解时,我观察到有三个按字母顺序排列的块。因此,我修改了初始解(源自当时的最佳解),使这些块的数量 ranging 从一到四,然后执行与之前相同的搜索。结果发现,拥有两个块时性能最佳,将分数提高到了 28.57。
  • 最后,我将随机插入改为变长随机插入。在 28.57 的解中,我注意到一些不符合字母顺序的序列(例如"card game"和"wrapping paper")。我认为如果最优解中存在由三个或更多单词组成的单个语义单元,仅靠随机插入将无法处理它们。通过这一更改,我能够达到 28.52 分。(事实上,似乎停用词部分中的"and and and"需要放在块之间。)
  • 参数:
    • 每次运行迭代次数 (n_iterations):50,000~100,000
    • 冷却计划 (Cooling Schedule):线性递减 (Linear Decrease)
    • 初始温度 (start_temp):0.1~1
    • 结束温度 (end_temp):0.01~0.1
    • 批大小 (batch_size):16, 24

计算资源

  • 在达到排行榜最优解之前,我在云端租用了 A100 显卡 10 天。
  • 前五天,我使用了一张 A100;后五天,一旦开始有改进,我使用了 3 张 A100 (A100×3)。
同比赛其他方案