我有一个基于checkers游戏的基类,我想将其子类化以实现不同的树搜索算法,minmax,alphabeta等。
所以我有类似
的东西public class Checkers {
....
public void findBestMove(Board b, int depth) {
for(mv:b.possibleMoves()) {
...
score = evalNode(b.domove(mv), depth + 1)
...
}
}
int evalNode(Board b, depth) {<insert recursive node eval algorithm here>}
}
适用于minmax。 对于alphabeta,我需要更多参数:
public void findBestMove(Board b, int depth) {
for(mv:b.possibleMoves()) {
...
score = evalNode(b.domove(mv), depth + 1, -9999999, -maxval)
maxval = max(score, maxval)
...
}
}
int evalNode(Board b, depth, alpha, beta) {<insert recursive node eval algorithm here>}
虽然findBestMove的基本逻辑对于所有树搜索方法都是相同的(生成所有可能的移动,尝试每个移动并将其传递给eval函数,返回最佳移动...),唯一的区别是调用评估函数,需要特定于算法的参数。
您能想到构建findBestMove方法的任何方法,以便我可以在所有子类中使用其基本逻辑(移动循环),但是具有不同的evalNode调用吗?在每个子类中重写它似乎是浪费。这只是我缺乏想象力还是这是不可能的?
答案 0 :(得分:3)
一种方法是引入界面:
interface NodeEvaluator {
int evalNode(Board b, depth);
}
并给它两个实现,其中第二个,将接受其他参数:
class MinMaxNodeEvaluator implements NodeEvaluator {
public int evalNode(Board b, depth) {
// evaluate node using min/max appproach
}
}
class AlphaBetaNodeEvaluator implements NodeEvaluator {
private int maxVal;
public AlphaBetaNodeEvaluator()
{
this.maxVal = Integer.MAX_VALUE;
}
public int evalNode(Board b, depth) {
int currentScore = evalNode(b, depth, Integer.MIN_VALUE, -this.maxval);
this.maxVal = max(currentScore , this.maxVal);
return currentScore;
}
private int evalNode(Board b, int depth, int alpha, int beta) {
//...
}
}
特定节点评估程序的实例应该适当地注入您的Checkers
类。