Alfa-béta vágás

játékelméleti keresési algoritmus
Ez a közzétett változat, ellenőrizve: 2023. április 25.

Az alfa-béta vágás egy játékelméleti keresési algoritmus, amellyel csökkenthető a játékfában lévő kiértékelendő állások száma a minimax algoritmus által szükséges kiértékelésekhez képest. Az algoritmust az olyan kétszemélyes játékoknál, mint például az amőba, sakk, go stb. lehet eredményesen használni gépi játékos készítésére. Az algoritmus alapötlete azon nyugszik, hogy ha a játékfában az éppen vizsgált lépésünkre az ellenfélnek van egy olyan erős lépése, ami miatt ezt a lépést úgyse választanánk (mivel a vizsgálat korábbi részéből már van jobb választásunk), akkor az erre a lépésre az ellenfél által adható további lépéseket nem szükséges megvizsgálni. (Más szóval: ha az ellenfél válaszlépése túl jó, akkor úgyse fogjuk meglépni az azt lehetővé tévő lépésünket.) Az algoritmusban ezen részjátékfák fölösleges vizsgálatának kihagyását hívjuk alfa-, illetve béta vágásnak. A minimax algoritmus ilyetén történő optimalizálása nem változtatja meg a kapott végeredményt.

Az alfa-béta vágás szemléltetése. A beszürkített részfákat nem kell megvizsgálni, mivel a baloldalt mellettük lévő lépés miatt alfa/béta vágás hajtható végre.

Az algoritmus

szerkesztés

Az algoritmus a játékfa bejárása közben két értéket tart karban, az ún. alfa és béta értéket, az alfa azt a minimum értéket jelenti, amit az ún. 'maximalizáló' játékos már biztosított magának, illetve a béta azt a maximum értéket, amit a 'minimalizáló' játékos biztosított magának. Az algoritmus induláskor a két értéket mínusz végtelen illetve plusz végtelenre inicializálja, majd a fa rekurzív vizsgálata közben folyamatosan állítgatja értéküket a két játékos által garantáltan elérhető értékekre. Ezáltal folyamatosan szűkül ez az alfa-béta ablak. Amint a béta kisebbé válik az alfánál, az azt jelenti, hogy ez az állás – ha mind a két játékos részéről a legjobb játékot tételezzük fel – nem állhat elő, így nincs is értelme tovább vizsgálni.

Az algoritmus pszeudo kódja:

alphabeta(node)
	return evaluate(node, -infinity, +infinity, true)

evaluate(node, alpha, beta, is_maximizing_node)
	if node_is_a_leaf()
		return the_heuristic_value_of_node
	if node_is_a_maximizing_node()
		for each child of node
			alpha = max(alpha, evaluate (child, alpha, beta))
			if beta <= alpha
				break
		return alpha
	if node_is_a_minimizing_node()
		for each child of node
			beta = min(beta, evaluate (child, alpha, beta))
			if beta <= alpha
				break
		return beta

Hatékonyság a minimaxszal szemben

szerkesztés

Az alfa-béta algoritmus előnye abból származik, hogy a játékfa bizonyos ágainak vizsgálatát megspórolja. Ezáltal a játékfa gyorsabb vagy mélyebb vizsgálatát teszi lehetővé. A vágások által realizálható előny sok tényezőtől függ, de a gyakorlati életben közelítőleg a vizsgálati mélység megduplázása érhető el vele. A vágások mértéke nagyon függ a játékfa „szélességétől”, amely paraméter leginkább az adott játék sajátossága, illetve attól, hogy milyen sorrendben értékeljük ki a lépéseket, egészen pontosan attól, hogy mennyire hamar értékeljük ki a mindenkori adott álláshoz tartozó legerősebb lépés(eke)t. Ezt elősegítendő célszerű erősorrendben megvizsgálni a lehetséges lépéseket, amely erősorrendet heurisztikus algoritmusokkal lehet megbecsülni. Ezek közül az egyik legegyszerűbb a gyilkos lépés heurisztikája, amely az aktuálisan vizsgált lépésre adható válaszok közül az előző vizsgált lépésre adott legjobb választ próbálja ki először.

Egy képzeletbeli játékfa esetében, amelynek minden csomópontjában konstans b lehetséges lépés van és d a mélysége, az alfa-béta algoritmus műveletigénye a legkedvezőtlenebb esetben egyenlő a minimax algoritmus műveletigényével, azaz  . A legkedvezőbb esetben, amikor minden csomópontban a legjobb lépéssel kezdjük a vizsgálatot, ez  . Azaz ugyanannak a fának a megvizsgálása négyzetgyöknyi levélcsomópont kiértékelését igényli, vagy más nézőpontból megközelítve: ugyanannyi levélcsomópont kiértékelése esetén kétszer olyan mély fát tudunk megvizsgálni.