Я разрабатываю программу для игры Line of Action (см. Спецификации здесь: http://www.boardspace.net/loa/english/index.html)
Для ИИ я создал дерево игр, очень похожее для большинства алгоритмов дерева игр, и это, кажется, работает.
Теперь я просто не уверен, как создать heuristi c - в основном, что происходит, когда глубина, на которой вы ищете, хороша ходы это ноль.
Это в основном функция, которая должна помочь мне оценить «счет» хода.
Основываясь на спецификациях, я сделал несколько разных факторов в своей функции, но я не уверен, как их взвесить.
Вот что я обдумываю (кстати, я оптимизирую для белого игрока):
- игра окончена? если да, вернуть победителя или 0, если он равен ie
- сравнить самые большие размеры регионов обоих игроков, предпочитая WP
- Сколько областей смежных фигур у обоих игроков? Чем больше, тем хуже, поэтому numRegionsBP - numRegionsWP
- сколько штук осталось? Чем больше, тем лучше.
- возможные ходы с текущей доской. Я перебираю и проверяю, не приводит ли какой-либо блок к BP или WP со всеми смежными частями (опять же, оптимизируя для WP)
Вот мой код, чтобы найти счет. К сожалению, это всегда приводит к ie, когда он должен оптимизировать одну сторону. Должен ли я изменить свои факторы или веса? Буду признателен за некоторые рекомендации:
private int staticScore(Board board) {
if(board.gameOver() && board.winner()!=null) {
if(board.winner().equals(WP)){
return WINNING_VALUE;
}
else if(board.winner().equals(BP)) {
return -WINNING_VALUE;
}
else {
return 0;
}
}
//factor for contiguous regions size
List whiteRegions = board.getRegionSizes(WP);
List blackRegions = board.getRegionSizes(BP);
int maxW = (int) Collections.max(whiteRegions);
int maxB = (int) Collections.max(blackRegions);
int contigRegions = maxW - maxB;
//factor for number of contiguous regions
int regionsNumW = whiteRegions.size();
int regionsNumB = blackRegions.size();
int regionsNumDifference = regionsNumB - regionsNumW;
//factor for number of pieces left - maybe delete
int numW = board.getNum(WP);
int numB = board.getNum(BP);
int numDif = numW - numB;
//account for moves to get me
int piecesContig = 0;
for (Move mv : getBoard().legalMoves()) {
getBoard().makeMove(mv);
if ((getBoard().piecesContiguous(BP))) {
piecesContig = -1;
break;
}
else if((getBoard().piecesContiguous(WP))){
piecesContig = 1;
break;
}
getBoard().retract();
}
return 20*contigRegions + 10*regionsNumDifference + 20*piecesContig;
}