मैं जावा में चेकर्स गेम के लिए अल्फा-बीटा छंटनी के साथ मिनीमैक्स को कार्यान्वित करने की कोशिश कर रहा हूं। मेरा मिनीमैक्स एल्गोरिदम पूरी तरह से काम करता है। मेरा कोड अल्फा-बीटा कोड के साथ जगह पर चलता है। दुर्भाग्यवश, जब मैं मानक मिनीमैक्स एल्गोरिदम बनाम 1000 गेम खेलता हूं, तो अल्फा-बीटा एल्गोरिदम हमेशा 50 गेमों के पीछे आता है।जावा मिनिमैक्स अल्फा-बीटा प्रुनिंग रिकर्सन रिटर्न
चूंकि अल्फा-बीटा छंटनी चाल की गुणवत्ता को कम नहीं करनी चाहिए, बस उन्हें प्राप्त करने में लगने वाला समय, कुछ गलत होना चाहिए। हालांकि, मैंने पेन और पेपर निकाला है और अनुमानित पत्ते नोड मानों को खींचा है और यह अनुमान लगाने के लिए मेरे एल्गोरिदम का उपयोग किया है कि यह सही सर्वोत्तम चाल की गणना करेगा या नहीं, और कोई तर्क त्रुटियां नहीं दिखाई देती हैं। मैंने इस वीडियो से पेड़ का उपयोग किया: Alpha-Beta Pruning मेरे एल्गोरिदम का पता लगाने के लिए। यह तर्कसंगत रूप से सभी विकल्पों को बनाना चाहिए, और इसलिए एक कार्यान्वयन कार्यान्वयन होना चाहिए।
मैंने कोड में प्रिंट स्टेटमेंट भी लगाए हैं (उन्हें अव्यवस्था को कम करने के लिए हटा दिया गया है), और मूल्यों को सही तरीके से वापस किया जा रहा है और ऐसा लगता है कि छंटनी होती है। मेरे सर्वोत्तम प्रयासों के बावजूद मैं यह पता लगाने में असमर्थ हूं कि तर्क त्रुटि कहां है। यह लागू करने में मेरा तीसरा अलग प्रयास है और उनमें से सभी को एक ही समस्या है।
मैं यहां पूरा कोड पोस्ट नहीं कर सकता, यह बहुत लंबा है, इसलिए मैंने त्रुटि के लिए प्रासंगिक विधियों को शामिल किया है। मैं निश्चित नहीं हूं, लेकिन मुझे संदेह है कि समस्या गैर-पुनरावर्ती चाल() विधि में हो सकती है, हालांकि मुझे इसमें एक तार्किक त्रुटि नहीं मिल रही है, इसलिए मैं बस इसके आसपास घूम रहा हूं, शायद चीजें बनाना एक कविता या कारण के बिना बेहतर से बदतर।
क्या लूप में रिकर्सिव कॉल से एकाधिक पूर्णांक मानों को पुनर्प्राप्त करने के लिए कोई चाल है? यह मेरे मिनीमैक्स और negamax कार्यान्वयन दोनों के साथ ठीक काम करता है, लेकिन अल्फा-बीटा छंटनी कुछ अजीब परिणाम उत्पन्न करने लगता है।
@Override
public GameState move(GameState state)
{
int alpha = -INFINITY;
int beta = INFINITY;
int bestScore = -Integer.MAX_VALUE;
GameTreeNode gameTreeRoot = new GameTreeNode(state);
GameState bestMove = null;
for(GameTreeNode child: gameTreeRoot.getChildren())
{
if(bestMove == null)
{
bestMove = child.getState();
}
alpha = Math.max(alpha, miniMax(child, plyDepth - 1, alpha, beta));
if(alpha > bestScore)
{
bestMove = child.getState();
bestScore = alpha;
}
}
return bestMove;
}
private int miniMax(GameTreeNode currentNode, int depth, int alpha, int beta)
{
if(depth <= 0 || terminalNode(currentNode.getState()))
{
return getHeuristic(currentNode.getState());
}
if(currentNode.getState().getCurrentPlayer().equals(selfColor))
{
for(GameTreeNode child: currentNode.getChildren())
{
alpha = Math.max(alpha, miniMax(child, depth - 1, alpha, beta));
if(alpha >= beta)
{
return beta;
}
}
return alpha;
}
else
{
for(GameTreeNode child: currentNode.getChildren())
{
beta = Math.min(beta, miniMax(child, depth - 1, alpha, beta));
if(alpha >= beta)
{
return alpha;
}
}
return beta;
}
}
//Checks to see if the node is terminal
private boolean terminalNode(GameState state)
{
if(state.getStatus().equals(win) || state.getStatus().equals(lose) || state.getStatus().equals(draw))
{
return true;
}
else
{
return false;
}
}
चेकर्स की मानक प्रारंभिक स्थिति होती है और अल्फा-बीटा छंटनी के साथ मिनीमैक्स और मिनीमैक्स दोनों निर्धारक एल्गोरिदम होते हैं, इसलिए प्रत्येक गेम को समान रूप से तब तक खेलना चाहिए जब तक कि आपने कहीं यादृच्छिकता पेश नहीं की हो। शायद यह यादृच्छिकता परिणामों में भिन्नता पैदा कर रही है। –
अल्फा-बीटा के साथ मिनिमैक्स और मिनीमैक्स निश्चित परिणामों का उत्पादन करने के लिए निश्चित रूप से माना जाता है, केवल अल्फा-बीटा छंटनी आपको परिणाम कुछ हद तक तेज़ी से देती है, "कुछ हद तक" यह निर्धारित किया जा रहा है कि आपके कदम को ह्यूरिस्टिक आदेश कितना अच्छा है। तो अपने अल्फा-बीटा कार्यान्वयन का परीक्षण करने का तरीका यह है कि बिना किसी स्थिति के बड़े सेट पर और इसके बिना मिनीमैक्स चलाएं और सत्यापित करें कि दोनों संस्करणों के लिए समान परिणाम उत्पन्न किए गए हैं। –
@ केली मुझे एहसास हुआ कि यह वास्तव में है क्योंकि मेरा मिनीमैक्स एल्गोरिदम बराबर सर्वोत्तम चालों में से एक यादृच्छिक कदम देता है और मेरा अल्फा-बीटा प्रुनिंग एल्गोरिदम केवल पहले सर्वोत्तम कदम को वापस लौटाता है (जिस तरह से अल्फा पास हो गया है, मेरा कार्यान्वयन बराबर नहीं मिल सकता चाल)। शुरुआत में बोर्ड के पक्ष में एक कदम प्लाई 3 पर समान होता है, लेकिन वास्तव में यह बदतर है, लेकिन यह अल्फा-बीटा छंटनी द्वारा माना जाने वाला पहला व्यक्ति है और इसलिए वापस आ गया है। तो सबसे अच्छे कदमों में से एक यादृच्छिक कदम उठाकर इस मामले में पहले व्यक्ति को चुनने से बेहतर है। सहायता के लिए धन्यवाद। – sage88