Реализовать альфа-бета-отсечение для минимакс

Я успешно реализовал минимаксный алгоритм для игры, которую я написал.

Проблема в количестве возможных ходов. Сортировка некоторых из них не будет работать, потому что каждый из этих шагов может иметь смысл.

Моя реализация заключается в следующем:

public int[] max (int depth, int player) {
    HashSet<Vector3i> vector3is = possibleMoves();          //Vector3i is equal to a move
    if(depth == 0 || vector3is.size() == 0){
        int[] ret = gameMap.getEvaluation();
        return ret;
    }

    int[] val = new int[players];
    int diff = -10000000;
    for(Vector3i v:vector3is){
        gameMap.place((int)v.x,(int)v.y,(int)v.z, player);  //takes the move
        int nextID = (player + 1) % players;                //nextPlayer ID
        int[] ar = max(depth-1, nextID);

        int diffN = 0;
        for(int i = 0; i < ar.length; i++) {
            if(i == player){
                diffN += ar[i];
            }else{
                diffN -= (int)(1.1 * ar[i]);
            }
        }

        if(diffN >= diff) {
            if(depth == this.depth)  {
                move = v;
            }
            diff = diffN;
            val = ar;
        }
        gameMap.undoPlace();
    }
    return val;
}

gameMap.getEvaluation() не включает минимизацию стоимости других игроков. Поэтому в forloop мой код пытается максимизировать значение diffN который учитывает расположение других игроков в данном состоянии. Оценка дается как int[]. Индекс 0 - это позиция игрока с индексом 0 и т. д.

Теперь я хотел бы реализовать алфавитный отсечение с этим. Я предполагаю, что вместо 2 значений, альфа и бета, мне нужен массив с размером, равным количеству игроков, которые я получил.

Я просто не знаю, как это реализовать.

Я был бы очень рад, если бы кто-то мог помочь мне с этим.

Привет, Финн

0 ответов

Другие вопросы по тегам