गहराई से गहराई से मैं अल्फा-बीटा न्यूनतम-अधिकतम आश्चर्यजनक तालिकाओं के साथ बढ़ाया जा रहा है। इस एल्गोरिथ्म के लिएअल्फा-बीटा ट्रांसपोजिशन टेबल के साथ आश्चर्यजनक,
http://people.csail.mit.edu/plaat/mtdf.html#abmem
function AlphaBetaWithMemory(n : node_type; alpha , beta , d : integer) : integer;
if retrieve(n) == OK then /* Transposition table lookup */
if n.lowerbound >= beta then return n.lowerbound;
if n.upperbound <= alpha then return n.upperbound;
alpha := max(alpha, n.lowerbound);
beta := min(beta, n.upperbound);
if d == 0 then g := evaluate(n); /* leaf node */
else if n == MAXNODE then
g := -INFINITY; a := alpha; /* save original alpha value */
c := firstchild(n);
while (g < beta) and (c != NOCHILD) do
g := max(g, AlphaBetaWithMemory(c, a, beta, d - 1));
a := max(a, g);
c := nextbrother(c);
else /* n is a MINNODE */
g := +INFINITY; b := beta; /* save original beta value */
c := firstchild(n);
while (g > alpha) and (c != NOCHILD) do
g := min(g, AlphaBetaWithMemory(c, alpha, b, d - 1));
b := min(b, g);
c := nextbrother(c);
if g <= alpha then
n.upperbound := g;
store n.upperbound;
if g > alpha and g < beta then
n.lowerbound := g;
n.upperbound := g;
store n.lowerbound, n.upperbound;
if g >= beta then
n.lowerbound := g;
store n.lowerbound;
return g;
तीन सवाल:
मैं belive कि मैं (पत्ता स्तर तक = दूरी) गहराई संग्रहीत करना चाहिए प्रत्येक बचाया स्थानांतरण के साथ मैं संदर्भ के रूप में इस स्यूडोकोड का उपयोग तालिका प्रविष्टि और केवल प्रवेश प्रविष्टि जब प्रविष्टि.depth> = currentDepth (= प्रविष्टि पत्तियों के स्तर से अधिक या बराबर होती है)। यह उपरोक्त छद्म कोड में नहीं दिखाया गया है और वहां पर चर्चा नहीं की गई है, मैं यह सुनिश्चित करना चाहता था कि मैं इसे सही ढंग से समझूं।
मैं प्रत्येक स्थिति के लिए इसे स्थानांतरित करने के लिए सबसे अच्छा स्थान स्टोर करना चाहता हूं और खोज स्टॉप के बाद सबसे अच्छा कदम निकालना चाहता हूं। शुद्ध न्यूनतम-अधिकतम में यह स्पष्ट है कि कौन सी चाल सबसे अच्छी है, लेकिन अल्फा-बीटा कटऑफ के साथ फिर से चलने पर कौन सी चाल सबसे अच्छी है? क्या मैं मान सकता हूं कि दी गई स्थिति के लिए सबसे अच्छा कदम सबसे अच्छा कदम है जब लूप समाप्त होता है (कट ऑफ या बिना)?
पुनरावर्तक गहन योजना में इस एल्गोरिदम को निष्पादित करते समय - क्या मुझे प्रत्येक गहराई में वृद्धि से पहले पारदर्शिता तालिका को साफ़ करना चाहिए? मुझे नहीं लगता, मैं चाहता हूं कि आप पिछले पुनरावृत्ति से संग्रहित स्थिति का उपयोग करें, लेकिन मुझे यकीन नहीं है कि जानकारी गहरी खोजों के लिए पर्याप्त है (यह तालिका प्रविष्टि गहराई की जांच करते समय होना चाहिए)?
अगर वहाँ कुछ परिस्थितियों में स्टोर करने के लिए कोई सबसे अच्छा कदम है, कैसे जो ले जाने के वी = aphaBeta (रूट, -inf, + inf) बुला के बाद सबसे अच्छा है तय करने के लिए? मैंने सोचा कि मैं रूट नोड के लिए अल्फाबेटा को कॉल करूंगा और इसके अलावा मिनीमैक्स वैल्यू (जो मेरे लिए इतना दिलचस्प नहीं है) के रूप में मुझे "जीतने" कदम मिलेगा। मुझे पता है कि मैं रूट नोड के प्रत्येक बच्चे के लिए अल्फाबेटा (बच्चा, -inf, + inf) निष्पादित कर सकता हूं और सर्वोत्तम चुन सकता हूं - क्या यह एकमात्र विकल्प है? – PanJanek
समझने के लिए निश्चित नहीं है ... 'aphaBeta (root, -inf, + inf) को कॉल करना' आप असफल कम/असफल उच्च नहीं हो सकते हैं, केवल सटीक स्कोर/सर्वोत्तम कदम (आपको ध्यान देना चाहिए कि इससे संबंधित प्रविष्टि को ओवरराइट न करें 'रूट' नोड)। आपको मेनलाइन निकालने के लिए खोज फ़ंक्शन को कॉल करने की आवश्यकता नहीं है: इसे सीधे ट्रांसपोजिशन टेबल से निकाला जा सकता है (उदाहरण के लिए https://chessprogramming.wikispaces.com/Principal+variation या http: //www.open-aurec देखें .com/wbforum/viewtopic.php? = 4 और टी = 3440 च)। कभी-कभी _ad-hoc_ पीवी टीटी का उपयोग किया जाता है। – manlio
संभोग, मैं भूल गया कि अल्फाबेटा को -inf के साथ कॉल करना, + inf सटीक स्कोर की गारंटी देता है। तो अगर मैं सही ढंग से समझता हूं, अल्फाबेटा (रूट, -इन्फ, + इंफ) को कॉल करने के बाद मैं हमेशा टीटी [root.getHash()] में सबसे अच्छा कदम रखूंगा, लेकिन अगर मैं ट्रांसपोजिशन टेबल से आगे की चाल निकालने का प्रयास करता हूं तो वहां कम हो सकता है उन्हें खोज गहराई से (क्योंकि कुछ पदों में सबसे अच्छा कदम नहीं होगा)? – PanJanek