返回列表

2nd place solution

383. Abstraction and Reasoning Challenge | abstraction-and-reasoning-challenge

开始: 2020-02-13 结束: 2020-05-27 数学与计算 数据算法赛
第二名解决方案

第二名解决方案

作者: Alejandro de Miquel, Roderic Guigo Corominas, YujiAriyasu
比赛: Abstraction and Reasoning Challenge

首先,恭喜 @icecuber。在这次比赛中以个人身份获得 0.79 的分数真的非常令人印象深刻。同时,非常感谢 @fchollet 举办这次比赛,让我们面对这个非常有趣的挑战。

在这里,我想简要讨论一下 @rguigocoro 和我开发的算法。我认为它在私有测试集上的得分是 0.87 或 0.88。排行榜(LB)上 0.81 的最终得分是与 @yujiariyasu 合并团队的结果,他在解决许多任务方面做得非常出色,而且幸运的是我们的任务几乎没有重叠。

对于每个任务,我们的算法遵循以下步骤:

  1. 生成一个 Task 类的对象。在此步骤中,完成所有预处理:检查矩阵形状、公共颜色、对称性等。有 6 个核心类用于存储有关预处理的信息:TaskSampleMatrixShapeGridFrontier 类。
  2. 根据从预处理中检索到的信息,任务可能会转换为更容易处理的形式。例如,修改某些颜色、旋转某些矩阵、裁剪背景或忽略网格可能是有意义的。
  3. 转换完成后,我们生成 3 个虚拟候选解,并进入循环以获取 3 个最佳候选解。在循环的每次迭代中,对于当前的 3 个最佳候选解中的每一个,我们尝试执行所有有意义的操作,这些操作基于存储在 Task 类对象中的属性。尝试了许多不同类型的函数,例如 "moveShapes"、"replicateShapes"、"extendColor" 或 "pixelwiseXorInGridSubmatrices",仅举几例。完整的函数列表可以在下面链接的 GitHub 存储库中找到。如果任何函数生成的候选解得分优于当前 3 个最佳候选解中的任何一个,我们将这个新候选解包含在我们的最佳候选解列表中,并移除最差的一个。得分简单地通过在训练样本中执行导致生成该候选解的函数,并检查有多少像素不正确来计算。因此,0 分是可能的最佳分数。
  4. 从 3 个候选解中还原在步骤 2 中执行的操作,以获得最终候选解。
  5. 如果有意义,我们会生成另一个任务,规定在每个样本中只能有一个形状或只有一个非公共颜色。显然,此时我们的训练和测试样本比原始任务多。然后,我们还为此版本计算三个最佳候选解,并将它们与先前生成的候选解进行比较,以选择最终的最佳候选解。

建立这整个流程是相当艰苦的工作,前 1.5 个月左右一直无法低于 0.99,这有点令人沮丧。但最终这证明效果相当不错。我们在算法中尝试了许多不同的函数,我们并不真正知道哪些函数解决了私有测试集的任务,因为我们的许多 LB 改进来自于适用于许多不同类型任务的通用预处理步骤。

所有代码,包括在排行榜上得分 0.813 的版本,都在 这个 GitHub 存储库 中。

同比赛其他方案