大家好,我第一次在Reddit发帖,所以有点紧张!
我想与大家分享一下最近完成的一个技术项目的经验。一个多于一周之前,我发现了Halite III的竞赛。
背景:Halite III是一个由Two Sigma创建的极其酷炫的编程挑战。几年前,Two Sigma就开始开发它了,虽然我不知道具体什么时候。每个人获得一个开发包(dev kit),然后就需要编写他们的bot代码。
玩法很简单:生成一个随机的2D棋盘,棋盘上有不同的棋子(halite),你需要让你的bot向那些棋子出发,收集它们,然后运回家。可以想象成像一个RTS小单位那样。遇到两只船碰撞,将会把它们上的halite掉在它们所在的方格上。
为了让游戏更具挑战性,每次回合时间被限制。如果你的bot需要太长时间来计算,每次回合将自动失败。
意思是要同时管理大量船只(100个甚至更多)的位置(在一个32x32的棋盘上),避免它们碰撞,并保持高性能。
这篇帖子将按照以下逻辑来描述技术的思考过程:
- 使用Flow Fields来解决返程交通堵塞
我的项目从使用A*来计算每个船只的返程路径开始,但是考虑到时间限制和碰撞问题,这个方法行不通。因此我尝试了使用Flow Fields,来优化船只的返程路径。
基本的步骤如下:
a)将所有船只和船yard的位置表示为一个表格。
b)使用一个算法来计算每个方格到船yard的花费(cost)。
c)根据这个表格来计算船只的返程路径。在这种情况下,船只不需要计算路径,只需要看它所在的方格,看看它的四个邻居哪一个花费最低就可以了。
这个Flow Fields方法显著减少了碰撞发生的频率,并且计算时间为O(1),无论船只的数量如何。
2.使用零分配A*来进行精确的攻击和移动
但是我仍然需要使用A来进行精确的攻击和移动。因为A需要进行大量的动态内存分配,这会导致性能下降。
解决方案是使用C++的lambda函数来减少对内存的分配和回收。
具体解决方案如下:
a)使用一个函数来创建一个邻居数组
b)用lambda函数来代替函数中的内存分配
c)使用lambda函数来提高性能和效率
这解决了使用A*时的内存分配问题,提高了性能。
3.随机数和遗传算法
现在我的项目基本完成了,我需要调整一些随机设定的值来使我的bot更好地玩游戏。遗传算法可以算是这个问题的最好解决方案。
具体步骤如下:
a)首先将所有随机设定的值暴露到一个txt文件中。
b)在一个独立的程序中,以多线程方式来执行遗传算法。这需要使用多线程来快速改变参数来测试每个参数。
c)使用Python读取结果并分析数据。
d)使用Python检查是否出现了bug,并使用Fluorine来视图数据。
这个步骤会显著提高bot的性能,并且会提供更好的游戏体验。
结论:
这是一次有意愿并且有挑战性的项目。虽然有一些困难,但最终我们成功完成了。
如果你有进一步的问题或建议,请不要犹豫告诉我,我会乐意回答。
下面是一些需要注意的提示:
1)使用Flow Fields减少碰撞发生频率,
2)使用零分配A*提高效率,
3)使用遗传算法来调整参数。
这些步骤会给你提供一个成功的bot,并且会让你在Halite III比赛中脱颖而出。
评论 (0)