minimax algoritmus
Kiejtés
- IPA: [ ˈminimɒksɒlɡoritmuʃ]
Főnév
- (matematika, algoritmusok, informatika) A Minimax algoritmus egy döntéshozatali eljárás, amelyet főként kétjátékos, nullösszegű játékokban alkalmaznak, például sakkban vagy tic-tac-toe-ban. Az algoritmus célja, hogy az egyik játékos maximalizálja a saját nyereségét, míg az ellenfél ugyanakkor próbálja minimalizálni azt.
Algoritmus alapelve
- Oszd meg és uralkodj:
- A játékállapotokat rekurzívan bontjuk kisebb részekre.
- Döntési szabály:
- A Maximizer a legnagyobb értéket próbálja elérni.
- A Minimizer a legkisebb értéket próbálja elérni.
- Kiértékelés:
- Az algoritmus a játékfa leveleitől (végállapotok) indul, ahol az értékeket közvetlenül meghatározza az állapot hasznossága.
- Visszaterjedés:
- Az állapotok értékei a játékfa leveleitől visszaterjednek a gyökérhez, ahol a Maximizer és Minimizer váltakozva választja ki a legjobb értéket.
Pszeudokód
Minimax(node, depth, maximizingPlayer): ha depth == 0 vagy node végállapot: térj vissza node értéke ha maximizingPlayer: maxEval = -végtelen minden child in node gyerekek: eval = Minimax(child, depth - 1, hamis) maxEval = max(maxEval, eval) térj vissza maxEval különben: minEval = +végtelen minden child in node gyerekek: eval = Minimax(child, depth - 1, igaz) minEval = min(minEval, eval) térj vissza minEval
Python implementáció
Alap Minimax
def minimax(position, depth, maximizingPlayer):
if depth == 0 or is_terminal(position):
return evaluate(position)
if maximizingPlayer:
maxEval = float('-inf')
for child in get_children(position):
eval = minimax(child, depth - 1, False)
maxEval = max(maxEval, eval)
return maxEval
else:
minEval = float('inf')
for child in get_children(position):
eval = minimax(child, depth - 1, True)
minEval = min(minEval, eval)
return minEval
Egyszerű példa: Tic-Tac-Toe
def evaluate(position):
# Kiértékelés logikája
# Például +1 győzelemért, -1 vereségért, 0 döntetlenért
pass
def get_children(position):
# Minden lehetséges lépésből származó új játékállapot
pass
def is_terminal(position):
# Ellenőrzi, hogy az állapot végállapot-e
pass
C++ implementáció
#include <iostream>
#include <vector>
#include <limits>
using namespace std;
const int MAX = numeric_limits<int>::max();
const int MIN = numeric_limits<int>::min();
// Kiértékelő függvény (példa)
int evaluate(vector<vector<char>>& board) {
// Implementálj kiértékelést
return 0;
}
// Ellenőrizze, hogy végállapot-e
bool is_terminal(vector<vector<char>>& board) {
// Implementálj végállapot ellenőrzést
return false;
}
int minimax(vector<vector<char>>& board, int depth, bool maximizingPlayer) {
if (depth == 0 || is_terminal(board)) {
return evaluate(board);
}
if (maximizingPlayer) {
int maxEval = MIN;
// Generálj gyermekállapotokat (példa)
for (auto& child : get_children(board)) {
int eval = minimax(child, depth - 1, false);
maxEval = max(maxEval, eval);
}
return maxEval;
} else {
int minEval = MAX;
// Generálj gyermekállapotokat (példa)
for (auto& child : get_children(board)) {
int eval = minimax(child, depth - 1, true);
minEval = min(minEval, eval);
}
return minEval;
}
}
int main() {
vector<vector<char>> board = {
{'_', '_', '_'},
{'_', '_', '_'},
{'_', '_', '_'}
};
int bestValue = minimax(board, 3, true);
cout << "A legjobb lépés értéke: " << bestValue << endl;
return 0;
}
Optimalizáció: Alfa-Béta Metszés
Az alfa-béta metszés csökkenti a játékfa ágainak számát, amelyeket ténylegesen ki kell értékelni. Ez jelentősen javítja a teljesítményt anélkül, hogy a végeredményt befolyásolná.
Pszeudokód:
AlphaBeta(node, depth, alpha, beta, maximizingPlayer): ha depth == 0 vagy node végállapot: térj vissza node értéke ha maximizingPlayer: maxEval = -végtelen minden child in node gyerekek: eval = AlphaBeta(child, depth - 1, alpha, beta, hamis) maxEval = max(maxEval, eval) alpha = max(alpha, eval) ha beta <= alpha: törés térj vissza maxEval különben: minEval = +végtelen minden child in node gyerekek: eval = AlphaBeta(child, depth - 1, alpha, beta, igaz) minEval = min(minEval, eval) beta = min(beta, eval) ha beta <= alpha: törés térj vissza minEval
Összegzés
- Előnyök:
- Optimális, ha a játékfa teljesen kiértékelhető.
- Alfa-béta metszéssel jelentős sebességnövekedés érhető el.
- Hátrányok:
- Nagy játékfák esetén túl lassú lehet, különösen mély fák esetén.
- A kiértékelő függvény minősége nagyban befolyásolja az eredményeket.
A Minimax algoritmus kiváló alapot nyújt mesterséges intelligenciák fejlesztéséhez, különösen játékokban, ahol a stratégia optimalizálása kulcsfontosságú.
- minimax algoritmus - Értelmező szótár (MEK)
- minimax algoritmus - Etimológiai szótár (UMIL)
- minimax algoritmus - Szótár.net (hu-hu)
- minimax algoritmus - DeepL (hu-de)
- minimax algoritmus - Яндекс (hu-ru)
- minimax algoritmus - Google (hu-en)
- minimax algoritmus - Helyesírási szótár (MTA)
- minimax algoritmus - Wikidata
- minimax algoritmus - Wikipédia (magyar)