返回列表

19th place solution: Loosen up, add a tree, and let the sparrows explore

688. Santa 2025 - Christmas Tree Packing Challenge | santa-2025

开始: 2025-11-17 结束: 2026-01-30 物流与供应链 数据算法赛
第 19 名解决方案:放松一点,加一棵树,让麻雀去探索

第 19 名解决方案:放松一点,加一棵树,让麻雀去探索

作者: Vineet K Reddy
发布日期: 2026-01-31
竞赛排名: 19

祝贺获奖者!!

Kaggle 团队做得好。这是一次令人兴奋的经历。谢谢!

=========

我想分享给我带来最大收益的方法。

该方法的主要思想是使用 sparrow,基于良好的 n-1 棵树 排列(packing)创建一个良好的 n 棵树 排列,同时 不过度干扰良好的 n-1 棵树排列。为此,以下方法对我最有效:

  1. 通过将所有的树的中心 x 和 y 坐标乘以一个小因子(例如 1.03)来放松 n-1 棵树排列。
  2. 在放松后的 n-1 棵树排列顶部添加一棵额外的树,以获得 n 棵树排列(暂时会有重叠)。我将额外的树正好添加在现有树的最右下角。
  3. 将上述 n 棵树排列(带有重叠)传递给 sparrow。让 sparrow 在探索模式下运行,利用放松步骤引入的松弛空间移动现有树来解决重叠问题。我对 sparrow 进行了最小程度的修改,使其直接适用于正方形排列。

下图是放松引入的松弛空间的放大视图。左子图是 182 棵树排列。右子图是同样的排列通过 1.0356 的因子放松后的结果。观察右侧子图中树之间的松弛/间隙。

放松排列示意图

下面的视频捕捉了 sparrow 解决重叠并偷偷放入额外树的(美丽🤩)过程。向 sparrow 的作者(Jeroen Gardeyn 及其同事)致敬!!

观看视频演示

在视频中显示的示例中,使用 182 棵树排列来实现 183 棵树排列。182 棵树排列的边长为 7.7497。通过使用 1.0356 的因子进行放松,边长变为 8.0259。在视频的第一帧中,右下角红点处有两棵重叠的树。其中一棵是 182 棵树排列中最右下角的树,另一棵是正好放置在该树上的额外树。运行 sparrow 70 秒解决了重叠问题,额外树被成功放入,得到边长 = 7.9237 的 183 棵树排列(如视频最后一帧所示)。

我将上述方法与多起点(multi-start)和筛选(culling)混合使用,通过使用不同的 sparrow 种子和不同的放松因子。这让我为给定的 n 收集了一批配置。例如,以下是从 182 棵树排列获得的 183 棵树排列的三种配置。

183 棵树排列的三种配置

(注意并非所有起点都能解决重叠问题。那些未能解决重叠问题的起点会被早期筛选掉)。

最后,我使用 sa_fast_v2eazy 压缩了上述获得的前几个排列。感谢 sa_fast_v2 和 eazy 的作者!例如,sa_fast_v2 将上述 183 棵树排列从边长 = 7.9237 压缩到 7.7792,如下面的图片所示。

压缩后的排列示例

上述方法为我提供了大多数 n > 60 的最佳排列。

=========

我的提交 csv 文件 attached 在下方的项目文件中。

最终提交的图片位于下方项目链接的数据集中。

附件文件

同比赛其他方案