有一个我用java编程的游戏。游戏很简单(参见下图)。有4只鸟和1只幼虫。这是一个2人游戏(AI vs Human)。
当比赛开始时,幼虫开始,然后一只鸟可以移动(任何一只),然后是幼虫等......
我已经实现了MiniMax(Alpha Beta修剪),我正在使用以下evaluate()函数(启发式函数)。
让我们在棋盘上的每个方格上给出以下数字。
因此,我们的评估功能将是
h(n)=幼虫的位置值 - 鸟的位置值1 - 鸟的位置值2 - 鸟的位置值3 - 鸟的位置值4
幼虫将尝试最大化启发式值,而鸟类会尝试将其最小化示例:
然而,这是一个简单而天真的启发式方法。它不会以聪明的方式行事。我是AI的初学者,我想知道如何改进这个启发式功能?
什么是好的/知情的启发式?
答案 0 :(得分:2)
这个怎么样:
最大值:幼虫
最低限度:鸟类
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):反映鸟类更接近幼虫的条件(阻止它)。
我相信仍有许多事情可以考虑,例如,最接近幼虫的鸟应该优先选择移动,但关于上述功能的方向是有意义的,并且许多细节可以被认为是轻松改进。
答案 1 :(得分:2)
有一种简单的方法可以大大改善你的启发式。在当前的启发式算法中,方形A1的值比方形A8的值小8。这使得Bird倾向于向游戏板的左侧移动,因为向左移动总是高于向右移动。这是准确的。第1行上的所有方块应具有相同的值。因此,分配行1 a 1,行2 a 2等中的所有正方形。这样,鸟类和幼虫不会倾向于向左移动,而是可以集中精力进行良好的移动。
答案 2 :(得分:1)
你可以考虑这样一个事实:当幼虫位于木板的两侧时,幼鸟将具有优于幼虫的位置优势,因此如果幼虫是MAX,那么将木板的侧边砖值更小。 / p>