我用Java编写了一个游戏。这个游戏很简单(请参考下图)。游戏中有4只鸟和1只幼虫。这是2人游戏(AI对人)。
- 幼虫可以向前和向后斜向移动
- 鸟只能向前斜向移动
- 如果幼虫能到达第1行(围栏),幼虫获胜
- 如果鸟没有可移动的步数,幼虫也获胜
- 鸟不能“吃掉”幼虫
- 如果幼虫没有可移动的步数(完全无法移动),鸟获胜
游戏开始时,幼虫先移动,然后一只鸟可以移动(任意一只),然后是幼虫,依此类推…
我已经实现了极小极大算法(Alpha-Beta剪枝),并使用了以下evaluate()函数(启发式函数)。
让我们为棋盘上的每个方格赋予以下数字。
因此,我们的评估函数将是
h(n) = 幼虫位置的价值 – 鸟1位置的价值 – 鸟2位置的价值 – 鸟3位置的价值 – 鸟4位置的价值
幼虫会试图最大化启发式值,而鸟会试图最小化它
示例:
然而,这是一个简单且幼稚的启发式函数。它没有以智能的方式行动。我是AI的初学者,我想知道我可以做些什么来改进这个启发式函数?
什么样的启发式函数会更好、更有信息量?
回答:
考虑这样做:
最大化:幼虫
最小化:鸟
H(t)=max_distance(larva,line_8)+Σmin_distance(bird_n,larva)
或者
H(t)=Σmin_distance(bird_n,larva) - min_distance(larva,line_1)
max_distance(larva,line_8):反映幼虫更接近第1行的条件。
Σmin_distance(bird_n,larva):反映鸟更接近幼虫(以阻挡它)的条件。
我相信还有很多其他因素可以考虑,例如,最接近幼虫的鸟应该优先选择移动,但上述函数的方向是有意义的,许多细节可以很容易地进行改进。