Algorithm 2048启发式,意外结果

Algorithm 2048启发式,意外结果,algorithm,artificial-intelligence,minimax,Algorithm,Artificial Intelligence,Minimax,我在为2048年的人工智能工作。到目前为止,它非常简单,我基本上是在尝试制作一条减少瓷砖的“蛇”,所以完美的游戏看起来是:,尽管这和这个一样好: 我的启发式方法是使用一个简单的2d数组,将每个单元格乘以振幅递减的抖动形状,如: --------------------- | 16 | 15 | 14 | 13 | | 9 | 10 | 11 | 12 | | 8 | 7 | 6 | 5 | | 1 | 2 | 3 | 4 | --------------------- 这项工

我在为2048年的人工智能工作。到目前为止,它非常简单,我基本上是在尝试制作一条减少瓷砖的“蛇”,所以完美的游戏看起来是:,尽管这和这个一样好:

我的启发式方法是使用一个简单的2d数组,将每个单元格乘以振幅递减的抖动形状,如:

---------------------
| 16 | 15 | 14 | 13 |
| 9  | 10 | 11 | 12 |
| 8  | 7  | 6  | 5  |
| 1  | 2  | 3  | 4  |
---------------------
这项工作相对来说很好,大约有一半的时间达到2048年,但有时它会做出非常奇怪的决定,比如:

是否有可能调整权重或增加某种惩罚来惩罚这种行为?其他的一切都很好,甚至在数学上,其中一些也没有任何意义。F.ex#3明显比向下好,最大的被乘数在拐角处,将256合并到拐角处应该会产生最好的结果

编辑:


对于您的启发式,您可以尝试:

| 32768 16384 8192 4096 |
|  256   512  1024 2048 |
|  128    64   32   16  |
|   1     2     4    8  |

并找出最小值?

检测正确值为左,启发式值为右的情况,并对其进行调整。您能否进一步解释您的算法是如何选择解决方案的,比如您的一个示例,每个可能性的分数(上、下、左、右)。这将帮助我们更好地理解您的算法并对其进行优化!如果在代码中的某个地方,您有一系列可能的移动方式,如:
[“右”、“下”、“左”、“上”]
,那么您可以尝试在出现平局时重新排列移动顺序:
[“左”、“上”、“右”、“下”]
。即使没有这样的数组结构,同样的想法也可能成立。。。如果多个移动之间出现平局,只需重新调整移动优先级。@Limonup:我没有很好地阅读你的代码,Minmax是一个不错的选择是的!我想我们应该研究你的启发法,我会考虑的!我认为你的问题是,规划给定数量的移动的算法总是在每个虚拟移动后随机放置一个虚拟块。然后选择在
n
移动后处于最佳状态的移动。在您提供的示例中,算法可能认为在做了看似不好的动作后,该动作最终会导致非常好的情况。这当然是失败的,因为在移动之后放置的实际块不太可能与前面的规划中的位置相同。结果:最小值的平均最大值为64。相同的掩码,但最大值的平均值为256。问题是这些数字太大了,正确的最大平铺将基本上抵消其他单元格。通过这种启发式,它通常会形成这样的模式,而不是“蛇”。这是效率较低,往往会阻碍进一步的进展。我认为正确的方法是使用我已有的面具,但要有其他惩罚因素。我一直在研究平滑度函数。空间用完后,这里描述了平滑度函数:其思想是,一旦它处于snake模式中,打破它将非常昂贵,因为非平滑度将增加。
def heuristic(board):
    return max([mulArr(board, grid) for grid in grids])


def mulArr(arr1, arr2):
    return sum([arr1[i][j]*arr2[i][j] for i in xrange(len(arr1)) for j in xrange(len(arr1))])
| 32768 16384 8192 4096 |
|  256   512  1024 2048 |
|  128    64   32   16  |
|   1     2     4    8  |