如何改进此算法来解决修改过的邮票拼图?

时间:2010-09-24 09:39:34

标签: algorithm optimization azspcs

4 个答案:

答案 0 :(得分:3)

我实际上参加了这次比赛,因为你注意到我总共得到了100分,收到了87.00分。我实际上使用了你的方法因为我意识到为每个问题产生一个“合理的”解决方案是第一个要克服的障碍。在我跑的时候,产生的积分足以让我上升到94点左右,但随着最高收入者提高他们的分数,这个数字迅速下降到75左右。

你可以做的第一件也是最简单的事情就是要意识到你的程序会在瞬间运行,如果不是,你应该花时间优先考虑这个问题。一旦它以足够快的速度运行,您就可以立即生成D = 3R <= 5的所有可能集合。然后,您可以使用R = 5处的集合作为贪婪算法的种子。现在不是一个贪婪的解决方案,而是几千个,你只需要跟踪每个级别R生成的最高值以及创建它的值。这很容易做到,这将使你的分数高于80。

我花了将近一个月的时间来优化函数,可以测试任何随机输入集,这样我就可以将种子生成器打到R = 10并在单个核心上运行大约8小时。这保证了'D = 3','R&lt; = 10'的最佳解决方案,并且R > 10比原始贪婪的结果更好。这使我的得分非常接近于每个R尽可能高地运行D之后的结果,同时仍能在一天内运行该程序。我R = 9 D = 4R = 8D = 5R = 8D = 6

在运行这些之后,我计算出,对于刚刚列出的数字,我将无法将R增加1,并让它在我的生命周期内完成执行。显然是时候寻找新技术了。我认为通过测试每个可能的起始段,我在前端做得很好,所以为什么不通过为每个起始段测试更深层次的结果集来将其中的一些转移到后端。我没有在同一级别上获得最佳的下一个结果,而是进行了2级前瞻,并从两个级别深度获得了最佳的下一个值。例如,您始终以1开头,然后枚举D的所有值,然后为每个值评估R = 2 (2, 3, 4)的所有可能值。所以R = 3。取所有这些评估中的最高评分,然后选择2 (3, 4, 5, 6, 7), 3 (4, 5, 6, 7, 8), 4 (5, 6, 7)处包含R = 2最高值的值。这需要更多的处理时间,并且要求我降低我可以用来播种它的最大R = 3,但它为更深层次的搜索产生了更好的结果。

此时我放弃了贪婪的方法,并利用这次比赛来扩展我的AI知识。我尝试使用各种蒙特卡罗技术以及基本的遗传算法。我学到了很多关于蒙特卡洛的知识,并且在本次比赛中找到一些表现最好的人,找到了关于蒙特卡罗选择标准优化的出版物,这是我无法理解的。我希望我能够进一步帮助你,但我有信心在我的一生中用贪婪的方法打破90分是不可能的。我很想知道如果它是多线程的,并且有很多权力被抛出,那么答案会有多好。

我没有为此问题所做的任何工作,但我记得显示前瞻性和更多的起始种子枚举是这个问题的贪婪算法的唯一两个可能的改进。如果我能找到笔记的话,今晚我会为这些东西发布并发布思考过程。

编辑:最初发布在已弃用的服务器上的代码。如果您希望重新发布,请留言。

答案 1 :(得分:1)

感谢您提出一个非常有趣的问题!我花了几分钟时间来理解这个问题。

我没有看到问题的符号表述,所以,让我试着在这里写一个符号。

首先,观察(正如你所做的那样),其中一个区域必须为1,否则1将无法实现。

其次,由于我们试图最大化无法达到的分数,重复区域值没有意义。

所以,这给出了一个退化(但不是最优)的解决方案: 1,2,3,...... R

这种退化解决方案的目标函数值是: d * R + 1

例如,如果您有D = 4个飞镖,并且您使用分数1,2.40为您的飞镖着色,则可以获得从值1到160的每个分数。 161是不可能实现的。

显然,这个解决方案并不是最优的,最佳解决方案可能会涉及2的一些权力,并且肯定会有一些想法。

现在用于表示法:

设f(X,D,{Y_1..Y_R})=

  • 1如果使用飞镖靶上的D飞镖可以获得X分数 范围Y_1 ... Y_R
  • 0如果无法达到

作为前面讨论过的一个例子。 f(160,4,{1..40})= 1和 f(161,4,{1..40})= 0

拼图的目标函数值可以表示为:

g(D,(Y_1..Y_R})= Min X | f(X,D,{Y_1..Y_R})= 0

通过前面的观察1,我们可以假设Y_1 = 1。

此外,函数f的递归公式如下:

f(X,D,{1..Y_R} = 1如果:

  • X = 0或
  • f(X-Y_j,D-1,{1..Y_R})= 1对于某些j

[继续研究这个问题并在开发时发布更多内容。]

答案 2 :(得分:1)

最小的无法实现的元素最好只在最后一次迭代中查找。更好的主要子目标是具有给定飞镖数量的可实现元素的数量。一个有趣的子目标可能是

Nae * (Rt - Rc) / Rt + Msue, where
  • Nae - 可实现元素的数量(具有给定数量的飞镖)
  • Rt - 总可用区域
  • Rc - 当前使用的区域(当前递归级别)
  • Msue - 最大无法实现的最小元素

为什么Nae在早期迭代中比Msue更有价值?我们早期可以实现的元素越多,所有后续元素都将更易于使用,并产生更多组合,并达到更多可实现的元素。随着Nae的爆炸,Msue也很有可能上升到一个良好的水平。然而,在后期迭代中,Msue变得更加重要,并且新元素更多地用于“堵塞孔”,希望最后插入的孔尽可能远。

这个理由的物理比喻将是奥林匹克长跳,其中运动员在跑步开始时首先积累动量,但当他接近罚球线时他同步他的步数以使实际跳跃变得最有效。运动员从跑步开始就不会同步他的步数,因为动力在那个阶段更重要。

答案 3 :(得分:0)

一旦你暴力破坏了一些,你可能会看到一些模式来通知启发式搜索。例如,许多顶级解决方案都有这样的模式,D = 3,R = 40:一小段增加,一段较大的增加,然后是2倍的跳跃,然后是短期的小幅增加。

至少,它告诉你不要使用子集的想法,例如,3x30值是3x40的子集。

alt text