小编典典

什么是最好的战舰 AI?

all

现在,我想复活这场比赛,寻找最好的战舰AI。

这是现在托管在 Bitbucket 上的框架

获胜者将获得 +450 声望! 比赛将于 2009年11月17日 开始。17
日零时后不接受任何条目或编辑。(中部标准时间)尽早提交您的参赛作品,以免错过机会!

为了保持这个 目标 ,请遵循比赛的精神。

游戏规则:

  1. 游戏在 10x10 网格上进行。
  2. 每个参赛者将 5 艘船(长度分别为 2、3、3、4、5)中的每一艘放置在他们的网格上。
  3. 没有船只可以重叠,但它们可以相邻。
  4. 然后,参赛者轮流向他们的对手开枪。
    • 游戏的一个变体允许每次齐射多次射击,每艘幸存的船只一次。
  5. 如果击球落入、击中或未命中,对手将通知参赛者。
  6. 当任何一名玩家的所有船只被击沉时,游戏结束。

比赛规则:

  1. 比赛的精神是寻找最好的战舰算法。
  2. 任何被认为有悖于比赛精神的行为将被取消参赛资格。
  3. 干扰对手是违背比赛精神的。
  4. 多线程可以在以下限制下使用:
    • 轮到您时,最多只能运行一个线程。(尽管,任意数量的线程都可能处于“挂起”状态)。
    • 任何线程都不能以“正常”以外的优先级运行。
    • 鉴于上述两个限制,您将在轮到您时保证至少有 3 个专用 CPU 内核。
  5. 每场比赛的 CPU 时间限制为 1 秒,分配给主线程上的每个参赛者。
  6. 时间用完会导致当前游戏失败。
  7. 任何未处理的异常都将导致当前游戏失败。
  8. 网络访问和磁盘访问是允许的,但您可能会发现时间限制相当禁止。但是,添加了一些设置和拆卸方法以减轻时间压力。
  9. 代码应该作为答案发布在堆栈溢出上,或者如果太大,则链接。
  10. 条目的最大总大小(未压缩)为 1 MB。
  11. 正式来说,.Net 2.0 / 3.5 是唯一的框架要求。
  12. 您的条目必须实现 IBattleshipOpponent 接口。

评分:

  1. 101场比赛中最好的51场比赛是一场比赛的获胜者。
  2. 所有参赛者将以循环赛的方式进行比赛。
  3. 然后,最好的一半参赛者将进行双败淘汰赛以确定获胜者。(实际上大于或等于一半的二的最小幂。)
  4. 我将在比赛中使用TournamentApi框架。
  5. 结果将在此处发布。
  6. 如果您提交了多个条目,则只有您得分最高的条目才有资格获得双选。

祝你好运!玩得开心!


编辑 1:
感谢Freed,他在Ship.IsValid函数中发现了一个错误。它已被修复。请下载框架的更新版本。

编辑 2:
由于人们对将统计信息持久保存到磁盘等方面产生了浓厚的兴趣,因此我添加了一些应该提供所需功能的非定时设置和拆卸事件。这是一个 半突破性的变化
。也就是:修改了界面,增加了功能,但是不需要body。请下载框架的更新版本。

编辑 3:
错误修复 1:GameWon并且GameLost只在超时的情况下被调用。
错误修复 2:如果引擎在每场比赛中都超时,那么比赛将永远不会结束。
请下载框架的更新版本。

编辑 4:
比赛结果:


阅读 77

收藏
2022-04-15

共1个答案

小编典典

我支持每场比赛进行更多比赛的动议。玩 50 场比赛只是抛硬币。我需要做 1000 场比赛才能在测试算法之间做出合理的区分。

下载无畏 1.2

策略:

  • 跟踪命中 > 0 的船舶的所有可能位置。该列表永远不会超过〜30K,因此可以准确地保留它,这与所有船只的所有可能位置的列表(非常大)不同。

  • GetShot 算法有两个部分,一个生成随机射击,另一个尝试完成击沉已经击中的船只。如果有可能的位置(从上面的列表中)所有被击中的船只都被击沉,我们会随机射击。否则,我们会尝试通过选择一个位置进行射击,消除最可能的位置(加权)来完成沉船。

  • 对于随机拍摄,根据其中一艘未沉船与该位置重叠的可能性来计算最佳拍摄位置。

  • 自适应算法,将船只放置在对手在统计上不太可能射击的位置。

  • 自适应算法,它更喜欢在对手统计上更有可能放置他的船只的位置射击。

  • 放置的船只大多不相互接触。

2022-04-15