Algorithm 在战舰游戏中获得所有可能的有效位置

Algorithm 在战舰游戏中获得所有可能的有效位置,algorithm,Algorithm,我正在为战舰游戏创建概率助手——本质上,对于给定的游戏状态(战场状态和可用的战舰),它将生成所有自由单元都有命中概率的战场 我目前的方法是做一个类似蒙特卡罗的计算——得到随机的自由单元,得到随机的飞船,得到随机的飞船旋转,检查这个位置是否有效,如果有效,从可用的集合继续下一个飞船。如果可用集为空,请添加如何将船舶设置为输出堆栈。重复多次,使用输出计算每个单元的概率 对于给定的现场状态,是否有一个合理的算法来处理所有可能的船舶布置?一个精确的解决方案是可能的。但在我的书中,这并不符合理智 不过,这

我正在为战舰游戏创建概率助手——本质上,对于给定的游戏状态(战场状态和可用的战舰),它将生成所有自由单元都有命中概率的战场

我目前的方法是做一个类似蒙特卡罗的计算——得到随机的自由单元,得到随机的飞船,得到随机的飞船旋转,检查这个位置是否有效,如果有效,从可用的集合继续下一个飞船。如果可用集为空,请添加如何将船舶设置为输出堆栈。重复多次,使用输出计算每个单元的概率

对于给定的现场状态,是否有一个合理的算法来处理所有可能的船舶布置?

一个精确的解决方案是可能的。但在我的书中,这并不符合理智

不过,这是一个想法

游戏有很多变体,但假设我们从最坏的情况开始:1艘5号船,2艘4号船,3艘3号船和4艘2号船

棋盘的“发现状态”是所有已拍摄或发现船只的地点,加上剩余船只的数量。发现的状态天真地要求电路板使用100位(10x10,任何一个都可以放炮)加上1位用于剩余5号船舶的计数,2位用于剩余4号船舶,2位用于剩余3号船舶,3位用于剩余2号船舶。这就产生了108位,相当于14个字节

现在从概念上讲,我们的想法是通过在第一行、第二行依次拍摄每个方块,并记录游戏状态和转换来绘制地图。我们可以记录前向跃迁和计数,以找到到达任何状态的方法

然后找到所有完成的事情和使用的所有船只的最终状态,并向后走过渡,以找到从任何状态到最终状态的方法

现在让数据结构向前走,知道在到达终点的过程中到达任何状态的概率,但这一次我们可以在前进的过程中计算出每种方式在每个广场上找到一艘船的概率。把这些加起来,我们就得到了概率热图

这可行吗?在内存中,不是。但在分布式系统中可能是这样


记得我说过记录一个状态需要14个字节吗?再加上一个计数就需要8个字节,我们需要22个字节。添加反向计数需要30个字节。我的粗略估计是,在我们前进的道路上的任何一点上,都有大约5亿个州,我们可能处于各种各样的状态,还有各种各样的船只留下,遇难的船只伸出水面等等。这是15GB的数据。可能是100个正方形中的每一个。这是1.5TB的数据。我们必须处理3遍。< / P>我想这取决于你认为什么是明智的。做一些简单的数学计算,五艘飞船中的每艘至少有100个位置,所以你要看的是至少10^10配置中的一大部分,这是很多但不是很多,以至于你无法想象一个广泛使用位图的半实时实现。@Davidisenstat有5种飞船,但是有多达15艘船。这增加了问题的规模,超出了简单的暴力。啊,是的,那是行不通的。也许剩下的最佳选择是以某种方式进行MCMC,但我不知道如果有很多数据点,那么很好地进行条件采样会有多糟糕。谢谢你的估计,可能会有更多的数据,因为我们需要考虑到每艘船都可以进行有效的轮换(例如,2个正方形可以垂直和水平排列,3个正方形可以水平、垂直排列,L形可以分为4种类型——因此,总共有一艘3个正方形的战舰可以以6种可能的方式放置——这就是我小时候玩过的战舰类型)。@jozefow确实可以。我只估计了水平方向,然后添加了一个模糊因子。