Реализовать альфа-бета-отсечение для минимакс
Я успешно реализовал минимаксный алгоритм для игры, которую я написал.
Проблема в количестве возможных ходов. Сортировка некоторых из них не будет работать, потому что каждый из этих шагов может иметь смысл.
Моя реализация заключается в следующем:
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 значений, альфа и бета, мне нужен массив с размером, равным количеству игроков, которые я получил.
Я просто не знаю, как это реализовать.
Я был бы очень рад, если бы кто-то мог помочь мне с этим.
Привет, Финн