2013-11-15 5 views
5

मैं कंप्यूटर को कनेक्ट करने के लिए मिनीमैक्स का उपयोग कर रहा हूं 6. मैं एल्गोरिदम को गति देने के लिए अल्फा-बीटा छंटनी का भी उपयोग कर रहा हूं।ट्रांसपोजिशन टेबल?

मैं एल्गोरिदम को और भी तेज बनाने के लिए एक पारदर्शिता तालिका में जोड़ना चाहता हूं। मुझे उनके साथ बिल्कुल कोई अनुभव नहीं है।

क्या कोई ट्रांसपोजिशन टेबल की मूल बातें समझा सकता है, और वे कनेक्ट 6 जैसे गेम पर कैसे लागू होंगे? एक उपयोगी संसाधन के लिए एक लिंक ठीक होगा।

मैं "मी हैश तालिकाओं के साथ परिचित

मैं क्या पाया:।!

) http://chessprogramming.wikispaces.com/Transposition+Table

लिंक स्थानांतरण तालिकाओं का एक अच्छा विवरण देता है, लेकिन पूरी तरह से तो अपनी हार्ड आंकड़ा करने के लिए शतरंज पर केंद्रित शतरंज से स्वतंत्र रूप से कैसे कार्य तालिकाएं स्वतंत्र रूप से काम करती हैं।

उत्तर

8

लागू होने पर न्यूनतम रूप से मिनीमैक्स एल्गोरिदम को लागू करने के लिए प्रत्येक बोर्ड की स्थिति के लिए सर्वोत्तम खेल (एक मिनीमैक्स अर्थ में) की गणना करना पड़ता है भविष्य में भागो। अल्फा बीटा-प्रुनिंग अनावश्यक गणनाओं पर वापस कटौती करने में मदद करता है क्योंकि यदि आप जानते हैं कि आप कभी भी एक निश्चित कदम नहीं खेलेंगे तो आपको उस कदम को चलाने के मूल्य की गणना करने की आवश्यकता नहीं है।

कुछ खेलों के साथ किसी दिए गए बोर्ड पर सबसे अच्छा खेल समय पर उस समय बोर्ड की स्थिति द्वारा निर्धारित किया जा सकता है। शतरंज इस तरह है, इसलिए जाना है और कुछ अन्य खेल भी हैं। मुख्य अहसास यह है कि एक बार जब आप उस राज्य में पहुंचने के बाद किसी विशेष गेम स्थिति में पहुंचे तो वास्तव में कोई फर्क नहीं पड़ता (एक न्यूनतम दृष्टिकोण से)।

विशेष रूप से शब्द के शतरंज की भावना में एक पारदर्शिता तब होती है जब आप प्रारंभिक स्थिति से अंत स्थिति तक पहुंचने के लिए 2 अलग-अलग पथ लेते हैं।

ट्रांसपोजिशन टेबल आपको सबसे अच्छी स्थिति की गणना करने के लिए अनुकूलित करने देता है जब आप उन परिस्थितियों का सामना करते हैं जहां बोर्ड में अलग-अलग नाटकों का परिणाम होता है। अनिवार्य रूप से एक बार जब आप एक विशिष्ट बोर्ड स्थिति प्राप्त करते हैं तो आप बस उस स्थिति में अपनी न्यूनतम सीमा गणना के परिणाम को ट्रांसपोजिशन तालिका में संग्रहीत करते हैं। इसका मतलब यह है कि बाद में यदि चाल की कुछ अन्य अलग-अलग सूची उसी बोर्ड पर आती है तो अचानक आपको उस बोर्ड पर मिनीमैक्स को पूरी तरह से पुन: गणना करने की आवश्यकता नहीं होती है क्योंकि आप पहले ही ऐसा कर चुके हैं और आप इसे देख सकते हैं पारदर्शिता तालिका।

तो यदि खिलाड़ियों को एक ही बोर्ड की स्थिति में आने वाले कई तरीके हैं तो खेल के पेड़ की उस शाखा को नीचे डुप्लिकेट करने की आवश्यकता नहीं है यदि आप उस गणना के परिणामों को सहेजने में सक्षम हैं किसी न किसी तरह। इसे कुशलता से करने के लिए आपको बोर्ड की स्थिति का कुशलतापूर्वक प्रतिनिधित्व करने में सक्षम होना चाहिए, फिर कुछ डेटा संरचनाएं हैं जो आपको पारदर्शिता तालिका में उस बोर्ड की स्थिति को तुरंत देखने की अनुमति देती हैं। सही प्रतिनिधित्व ढूँढना आप जिस गेम का विश्लेषण कर रहे हैं उस पर भारी निर्भर करेगा।

तो connect6 is this game शायद एक उदाहरण अच्छा होगा:

बोर्ड इस (स्थिति ए) की तरह शुरू होता है कहते हैं:

X 0 
0 X 

वहाँ चाल है कि आप (स्थिति बी करने के लिए मिल के एक से अधिक सेट है):

X 0 0 0 
0 X X X 
0 X 

वहाँ है, स्थिति बी को स्थिति एक से जा रहा है, तो आप इस के बारे में चला गया भोलेपन से आप पदों पर सबसे अच्छा कदम को खोजने के लिए परीक्षण करने के लिए हो सकता है की एन तरीके कहो एन बी तक एन बार (पेड़ अल्फा-बीटा prunes बंद की शाखाओं के आधार पर)। लेकिन वास्तव में यह बहुत अच्छा होगा अगर हमें बी बोर्ड की स्थिति के लिए सटीक उसी गणना को कई बार नहीं करना पड़ेगा, तो उम्मीद है कि एक बार पर्याप्त होगा!

इस विचार का लाभ उठाने के लिए आपको क्या करना है, कनेक्ट 6 बोर्ड की स्थिति का प्रतिनिधित्व करने का एक तरीका ढूंढना है। बोर्ड का प्रतिनिधित्व करने का एक तरीका यह है कि N by N सरणी है जहां N बोर्ड आयाम है और प्रत्येक सेल के लिए एक एनम मान स्टोर करें जो कि यह खाली है, उसके पास X है या इसमें 0 है। हालांकि इस बेवकूफ दृष्टिकोण में पदों की तलाश करने के लिए बहुत अच्छी संपत्ति नहीं है क्योंकि हम हमेशा इन बुरा N by N सरणी के आसपास गुजर रहे होंगे। उल्लेख नहीं है कि इन N by N सरणी में से बहुत से स्टोर करना हमेशा बहुत मेमोरी लेगा।

तो यदि हम एक हैश फ़ंक्शन को परिभाषित कर सकते हैं जो N by N बोर्ड लेता है और इसे प्रोसेसिंग ओवरहेड के टन के बिना लगभग अनूठा पूर्णांक में मैप करता है तो हम इस प्रक्रिया को व्यवस्थित कर सकते हैं। बोर्ड को हश करना और यह देखना कि टेबल में है, तो उम्मीद है कि इस तरह से तेज हो।

इसलिए यही कारण है कि लोग उस विशिष्ट गेम के लिए हैशिंग फ़ंक्शन बनाने का प्रयास करते हैं जिसका वे विश्लेषण कर रहे हैं। कनेक्ट 6 के लिए मुझे नहीं पता कि सबसे अच्छा हैशिंग फ़ंक्शन क्या है, यह कुछ ऐसा है जो आपको काम करना होगा।

इस तरह से कुछ का सबसे अच्छा प्रदर्शन प्राप्त करने से टिंकरिंग का पूरा समूह लगता है लेकिन उम्मीद है कि इस पोस्ट ने आपको कुछ विचार दिए हैं। अगर आप मुझे कुछ भी विस्तार करना चाहते हैं तो कृपया टिप्पणी करें।

+0

बहुत बढ़िया, बहुत बहुत धन्यवाद! :) – dfg

2

This MediocreChess आलेख विवरण में पारदर्शिता तालिका बताता है। Zobrist algorithm पारदर्शिता तालिकाओं को बनाने के लिए बहुत आसान है।

दो शब्दों में zobrist प्रणाली:

  1. एक यादृच्छिक संख्या उत्पन्न टिक टीएसी को पैर की अंगुली के लिए [संभव टुकड़ा, संभव सेल] के प्रत्येक जोड़ी के लिए (यह 2 है (के 32 बिट मान लीजिए) * 9) और उन्हें एक सरणी में स्टोर करें। हैश = 0 पर
  2. प्रारंभ और [खेला टुकड़ा, खेला टुकड़ा की स्थिति]
  3. के प्रत्येक जोड़ी के लिए संग्रहीत संख्या के साथ XOR हैश आप अपने Zobrist कुंजी प्राप्त!

यह एक बहुत अच्छी प्रणाली है जो एक टुकड़े को हटाने की अनुमति देती है! आपको केवल उसी नंबर को एक्सओआर करना होगा। यह वास्तव में negamax/अल्फा-बीटा एल्गोरिदम के लिए उपयोगी है क्योंकि हमें कई बार राज्य को बदलना/पुनर्स्थापित करना है। ज़ोब्रिस्ट कुंजी को अद्यतित रखना आसान है।

स्थानांतरण तालिका की व्यवस्था है:

  • एक निश्चित खेल स्थिति के लिए, आप एक हैश, जो खेल की स्थिति के हस्ताक्षर, Zobrist एल्गोरिथ्म के साथ है उत्पन्न करते हैं, और आप एक पूर्णांक प्राप्त (उदाहरण के लिए 32 बिट्स या 64 बिट्स)।
  • यह "ज़ोब्रिस्ट कुंजी" एक पारदर्शी तालिका में, दी गई स्थिति के लिए सबसे अच्छी चाल और स्कोर को स्टोर करने के लिए सीधे उपयोग किया जा सकता है।
  • लेकिन शायद आप 2^32 या 2^64 प्रविष्टियों को स्टोर नहीं करना चाहते हैं, इसलिए आप पारदर्शिता तालिका की प्रविष्टियों को सीमित करने के लिए ज़ोब्रिस्ट कुंजी का "हैश" लेते हैं, मान लें कि 2 बिट्स के लिए 16 बिट्स 16 गेम की स्थिति (हकीकत में यह शायद> = 2^20) है। इस हैश को प्राप्त करने के लिए एक सरल विधि के लिए "सापेक्ष" zobrist कुंजी, या एक "बाइनरी और" करना है:

    स्थानांतरण तालिका सूचकांक = zobrist_key & 0xFFFF

आप 0 और बीच का एक पूर्णांक प्राप्त 2^16-1, यह ट्रांसपोजिशन टेबल में आपकी अनुक्रमणिका है! बेशक, हम टकराव का सामना कर सकते हैं, इसलिए हम पारदर्शिता तालिका में पूर्ण ज़ोब्रिस्ट कुंजी स्टोर कर सकते हैं।

आइए संक्षेपित:

  1. दी गई स्थिति के लिए, zobrist कुंजी zobrist कुंजी है, जो आपके स्थानांतरण तालिका में अपने सूचकांक हो जाएगा का एक हैश की गणना, और फिर। आइए इस तालिका प्रविष्टि में महत्वपूर्ण डेटा स्टोर करें: स्कोर, best_move, zobrist_key, ध्वज, गहराई।
  2. जब आपको पारदर्शिता तालिका में देखने की आवश्यकता होती है, तो दिए गए गेम की स्थिति के लिए ज़ोब्रिस्ट कुंजी की गणना करें, फिर इसके हैश, और संबंधित प्रविष्टि प्राप्त करें। फिर जांचें कि "झूठी सकारात्मक" की टक्कर समस्याओं से बचने के लिए, प्रविष्टि की ज़ोब्रिस्ट कुंजी आपके बराबर है या नहीं।

तो एक कनेक्ट 6 के लिए, आप 2 पत्थर रंग है, और के 59x59 पदों मान लें, ताकि आप 59x59x2 = 6962 यादृच्छिक संख्या की एक सरणी बनाने के लिए किया है। ज़ोब्रिस्ट कुंजी में गेम स्थिति को एन्कोड करने के लिए, प्रत्येक पत्थर लें, और इसके रंग और इसकी स्थिति के लिए, आपके द्वारा जेनरेट की गई संख्या लें और उन्हें एक साथ एक्सओआर करें। अपनी ज़ोब्रिस्ट कुंजी को इंडेक्स (हैश, बाइनरी "और", ...) में घटाएं, और अपनी डेटा को अपनी ट्रांसपोजिशन टेबल में इस इंडेक्स पर स्टोर करें।

संबंधित मुद्दे