Atölye › Satranç › 44/48. adım
Üç hamle derinlik yaklaşık 30 × 30 × 30 = 27.000 pozisyon demek; üstüne her birinde yasal hamle hesabı. Yavaş. Alfa-beta budama bunların çoğunu hiç açmadan atlar. İki sınır taşırız:
alpha → bizim garantimiz: şimdiye kadar bulduğumuz en iyi puan. Bundan kötüsü bizi ilgilendirmez.beta → rakibin izin vereceği en fazla: rakibin başka bir yolda zaten elinde tuttuğu seçenek.Bir hamle beta'ya ulaşırsa, rakip bu pozisyona hiç gelmeye izin vermez (başka yolu daha iyi). O yüzden buradaki
diğer hamlelerimize bakmaya gerek kalmaz: dalı budarız. Sonuç aynı, iş çok daha az.
```js
// Negamax with alpha-beta: the best score the side to move can force, looking `depth` moves ahead.
function search(depth, alpha, beta) {
const moves = legalMoves()
if (moves.length === 0) return inCheck(turn) ? -100000 - depth : 0
if (depth === 0) return evaluate() * (turn === 'w' ? 1 : -1)
for (const m of moves) {
const undo = makeMove(m)
const score = -search(depth - 1, -beta, -alpha)
undoMove(undo)
if (score >= beta) return beta
if (score > alpha) alpha = score
}
return alpha
}
const score = -search(DEPTH - 1, -Infinity, Infinity) + Math.random() // a tiny random tie-break
```function search(depth, alpha, beta) → iki yeni parametre: pencerenin alt ve üst sınırı.let best satırı gitti; onun işini artık alpha yapıyor: if (score > alpha) alpha = score.-search(depth - 1, -beta, -alpha) → rakibin gözünden bakınca pencere ters döner: bizim garantimiz onun
üst sınırı olur, onun üst sınırı bizim alt sınırımız. Puanı - ile çevirdiğimiz gibi sınırları da çeviririz.if (score >= beta) return beta → budama: rakip buna izin vermez; kalan hamlelere bakmadan dön.return alpha → bulunan en iyi (ya da garanti edilen) puan.computerMove'da -Infinity, Infinity → en üstte hiçbir sınır yok: en geniş pencere.search'ün yorumuna with alpha-beta ekle ve başlığını function search(depth, alpha, beta) { yap.let best = -Infinity satırını sil.-search(depth - 1) çağrısını -search(depth - 1, -beta, -alpha) yap.if (score > best) best = score satırının yerine iki satırı yaz: if (score >= beta) return beta ve
if (score > alpha) alpha = score.return alpha yap.computerMove içinde -search(DEPTH - 1) çağrısını -search(DEPTH - 1, -Infinity, Infinity) yap.Beceriler: Fonksiyonlar
← En iyi hamleyi seç Önce iyi görünen hamleler →