टिक-टैक-पैर की अंगुली अल्पमहिष्ठ कार्यान्वयन हमेशा पहले मुक्त स्थान देता है

वोट
0

मैं सबसे अच्छा कदम js में टिक टीएसी को पैर की अंगुली के प्रत्येक मोड़ खोजने के लिए Minimax लागू करने के लिए कोशिश कर रहा हूँ।

हालांकि, यह हमेशा पहले मुक्त स्थान देता है: 0,0 और इस मौके पर 0,1 और इतने लिया जाता है जब। ऐसा लगता है कि अल्पमहिष्ठ समारोह हमेशा 1 देता है।

let board = [
    ['', '', ''],
    ['', '', ''],
    ['', '', '']
];

const p1 = 'X';
const p2 = 'O';
const scores = {
    'X': 1,
    'O': -1
}

function bestMove(board, isMaximizing, player, turns) {
    let bestScore = isMaximizing ? -Infinity : Infinity;
    let bestMove;
    let score;

    for (let i = 0; i < 3; i++) {
        for (let j = 0; j < 3; j++) {
            if (board[i][j] == '') {
                board[i][j] = player;
                score = miniMax(board, !isMaximizing, isMaximizing ? p2 : p1, turns + 1);
                board[i][j] = '';
                if (isMaximizing) {
                    if (score > bestScore) {
                        bestScore = score;
                        bestMove = [i, j];
                    }
                }
                else {
                    if (score < bestScore) {
                        bestScore = score;
                        bestMove = [i, j];
                    }
                }

            }
        }
    }
    return bestMove;
}

function miniMax(board, isMaximizing, player, turns) {
    let winner = checkForWinner(board);
    if (winner != null)
        return scores[winner];
    if (turns > 9)
        return 0;

    let bestScore = isMaximizing ? -Infinity : Infinity;
    let score;

    for (let i = 0; i < 3; i++) {
        for (let j = 0; j < 3; j++) {
            if (board[i][j] == '') {
                board[i][j] = player;
                score = miniMax(board, !isMaximizing, isMaximizing ? p2 : p1, turns + 1);
                board[i][j] = '';
                if (isMaximizing)
                    bestScore = Math.max(score, bestScore);
                else
                    bestScore = Math.min(score, bestScore);
            }
        }
    }

    return bestScore;
}

मैं टिक-टैक-पैर की अंगुली के लिए Minimax के अन्य लोगों के कार्यान्वयन को देखकर की कोशिश की है, लेकिन मैं नहीं समझ सकता है क्या मेरा असफल बनाता है।

मैंने गलत क्या किया?

14/01/2020 को 00:03
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


1 जवाब

वोट
1

मैं अपने अल्पमहिष्ठ (negamax) कोड के साथ 2 समस्याओं देखें:

'1। अपने अल्पमहिष्ठ समारोह में आप सबसे अच्छा कदम बढ़ाने के लिए पाने के प्रत्येक वर्ग के माध्यम से जा रहे हैं। हालांकि आप केवल स्कोर लौट रहे हैं, नहीं सबसे अच्छा कदम। आप एक जीत चाल मिल जाए, तो यह लिख:

return None, 1

फिर अपने अल्पमहिष्ठ पुनरावर्ती कॉल में आप लिखते हैं:

miniMax(board, !isMaximizing, isMaximizing ? p2 : p1, turns + 1)[1]

नीचे वापसी पर आप लिखते हैं:

return bestMove, bestScore

आप bestScore कहाँ तय तुम भी, bestMove अद्यतन करने की आवश्यकता केवल तभी अधिकतम / न्यूनतम स्कोर बदल जाता है। क्या आप bestMove समारोह में करने के लिए इसी तरह की।

'2। अपने bestMove समारोह में आप सभी वर्गों के माध्यम से फिर से जा रहे हैं। यह वही है पर एक ही वर्ग वापसी बनाता है। चूंकि आपका अल्पमहिष्ठ सबसे अच्छा कदम मिलेगा आप केवल प्रारंभिक कॉल करने के लिए की जरूरत है:

bestMove, bestScore = miniMax(board, !isMaximizing, isMaximizing ? p2 : p1, turns + 1)

अन्यथा यह पहले वर्ग के पास जाकर पूरा अल्पमहिष्ठ करेंगे, इसलिए स्थिति के लिए सबसे अच्छा कदम (चाहे चाल शुरू करने की) यह पता लगा। चूंकि यह सबसे अच्छा कदम तुलना में एक बेहतर कदम लगता है कभी नहीं होगा, यह पहली संभव वर्ग की तुलना में कुछ और करने के लिए bestMove अपडेट नहीं होगा।

आशा है कि मैं किसी भी अर्थ निकालने कर रहा हूँ, अंग्रेजी मेरी मूल भाषा नहीं है और मैं केवल पायथन में कोडिंग करने के लिए इस्तेमाल कर रहा हूँ :)

15/01/2020 को 10:50
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more