所以基本上,我必须编写一个战舰 AI,它遵循所有常规规则,除了你不会被通知你的射击是否击沉了一艘船——不管它是命中还是未命中
。现在我有一个工作的 AI,但它的问题是它必须在每艘敌舰周围一直开枪,因为它不知道船是否沉没 - 这个视频可能会更好地解释它(对于那些想知道,有一些定制的船形状,板是 L 形的):https
://www.youtube.com/watch?v=
SzLspp4JzNE 关于如何减少所需射击次数的任何建议?
非常感谢 :)
所以基本上,我必须编写一个战舰 AI,它遵循所有常规规则,除了你不会被通知你的射击是否击沉了一艘船——不管它是命中还是未命中
。现在我有一个工作的 AI,但它的问题是它必须在每艘敌舰周围一直开枪,因为它不知道船是否沉没 - 这个视频可能会更好地解释它(对于那些想知道,有一些定制的船形状,板是 L 形的):https
://www.youtube.com/watch?v=
SzLspp4JzNE 关于如何减少所需射击次数的任何建议?
非常感谢 :)
计算机可以拥有哪些信息?船的数量,每艘船的块数,每艘船的形状。该算法必须检查所有剩余船只的形状并选择下一个字段,以使命中的机会最大。也许有比“最大命中机会”更好的长期策略,但在深入研究策略之前先解决形状识别部分。
如果事先不知道船的形状,那么算法就无能为力了。它所能做的就是检查被击中的方块是否是最大的剩余船只的一部分。这里的高级策略是确定最大的船是否不能在其他任何地方。如果还有其他船只,则使用轮流搜索它们,但在这样的搜索模式中,您也可以消除最大的船只在其他地方的可能性。
但是,如果每回合的攻击次数与你剩余的船只数量成正比,那么你必须尽快消灭每艘船只,所以不应该使用上面的“高级”策略。
最基本的想法是保留有关沉没船只和剩余船只的信息(我假设您知道,有些a_i
船有i
碎片),以及您沉没所有 4 件,并击中一些连接的 3 件船的信息会知道,没有必要再绕着它开枪了。因此,一般来说,您可以在被击中的船周围射击,因为被击中的碎片数量少于最大的非空船类中的碎片数量。一旦你沉没了一些 - 你会减少相应的船级计数器。
一些有趣的替代方法是根据玩过的游戏学习一些船舶位置和形状的统计数据——如果你与人类玩家对战,他很可能不会在任何地方放置任何船舶——有一些心理方面会“偏向”你决定您认为“很难找到”的位置 - 您的程序可以学习这样的条件概率,并使用它来假设它有信心在不绕开它的情况下击沉一艘船。不幸的是,这不适用于精心设计的 - 统一放置船只 - 算法。