Heuristi c для AI в настольной игре, приводящий к ничьей - PullRequest
0 голосов
/ 02 апреля 2020

Я разрабатываю программу для игры 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;
    }

...