"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > DQN का उपयोग करके एक शतरंज एजेंट का निर्माण

DQN का उपयोग करके एक शतरंज एजेंट का निर्माण

2025-03-24 को पोस्ट किया गया
ब्राउज़ करें:972

मैंने हाल ही में एक DQN आधारित शतरंज एजेंट को लागू करने की कोशिश की।

अब, जो कोई भी जानता है कि DQNS और शतरंज कैसे काम करता है, आपको बताएगा कि यह एक गूंगा विचार है।

और ... यह था, लेकिन एक शुरुआत के रूप में मैंने इसका आनंद लिया। इस लेख में मैं इस पर काम करते समय सीखे गए अंतर्दृष्टि को साझा करूंगा।


पर्यावरण को समझना।

]

]
    kaggle_environments आयात मेक से env = make ("शतरंज", debug = true)


  • ]
     from kaggle_environments import make
     env = make("chess", debug=True)
    
    इस वातावरण में, बोर्ड की स्थिति को FEN प्रारूप में संग्रहीत किया जाता है।


  •  from Chessnut import Game
     initial_fen = env.state[0]['observation']['board']
     game=Game(env.state[0]['observation']['board'])
    

फेन को मैट्रिक्स प्रारूप में परिवर्तित करना

Building a Chess Agent using DQN

]

पर्यावरण के लिए एक आवरण बनाना


वर्ग envcust: def __init __ (स्व): self.env = मेक ("शतरंज", डिबग = सच) self.game = game (env.state [0] ['अवलोकन'] ['बोर्ड']) प्रिंट (self.env.state [0] ['अवलोकन'] ['बोर्ड']) self.action_space = game.get_moves (); self.obs_space = (self.env.state [0] ['अवलोकन'] ['बोर्ड']) def get_action (स्व): रिटर्न गेम (self.env.state [0] ['अवलोकन'] ['बोर्ड'])। get_moves (); def get_obs_space (स्व): FEN_TO_BORD (self.env.state [0] ['अवलोकन'] ['बोर्ड'] लौटें) डीईएफ चरण (स्व, एक्शन): इनाम = ० g = game (self.env.state [0] ['अवलोकन'] ['बोर्ड']); if (g.board.get_piece (game.xy2i (क्रिया [2: 4])) == 'q'): इनाम = 7 elif g.board.get_piece (game.xy2i (एक्शन [2: 4]) == 'n' या g.board.get_piece (game.xy2i (एक्शन [2: 4]) == 'b' या g.board.get_piece (game.xy2i (2: 4]) == 'r': इनाम = 4 elif g.board.get_piece (game.xy2i (क्रिया [2: 4])) == 'p': इनाम = 2 g = game (self.env.state [0] ['अवलोकन'] ['बोर्ड']); g.apply_move (कार्रवाई) किया = गलत if (g.status == 2): किया = सच इनाम = 10 एलिफ जी.एसटीएटीस == 1: किया = सच इनाम = -5 self.env.step ([कार्रवाई, 'कोई नहीं']) self.action_space = list (self.get_action ()) if (self.action_space == []): किया = सच अन्य: self.env.step (['कोई नहीं', random.choice (self.action_space)]]) g = game (self.env.state [0] ['अवलोकन'] ['बोर्ड']); यदि g.status == 2: इनाम = -10 किया = सच self.action_space = list (self.get_action ()) लौटें self.env.state [0] ['अवलोकन'] ['बोर्ड'], इनाम, किया

]

] Building a Chess Agent using DQN

एक रिप्ले बफर बनाना

]

सहायक कार्य

class EnvCust:
    def __init__(self):
        self.env = make("chess", debug=True)
        self.game=Game(env.state[0]['observation']['board'])
        print(self.env.state[0]['observation']['board'])
        self.action_space=game.get_moves();
        self.obs_space=(self.env.state[0]['observation']['board'])

    def get_action(self):
        return Game(self.env.state[0]['observation']['board']).get_moves();


    def get_obs_space(self):
        return fen_to_board(self.env.state[0]['observation']['board'])

    def step(self,action):
        reward=0
        g=Game(self.env.state[0]['observation']['board']);
        if(g.board.get_piece(Game.xy2i(action[2:4]))=='q'):
            reward=7
        elif g.board.get_piece(Game.xy2i(action[2:4]))=='n' or g.board.get_piece(Game.xy2i(action[2:4]))=='b' or g.board.get_piece(Game.xy2i(action[2:4]))=='r':
            reward=4
        elif g.board.get_piece(Game.xy2i(action[2:4]))=='P':
            reward=2
        g=Game(self.env.state[0]['observation']['board']);
        g.apply_move(action)
        done=False
        if(g.status==2):
            done=True
            reward=10
        elif g.status == 1:  
            done = True
            reward = -5 
        self.env.step([action,'None'])
        self.action_space=list(self.get_action())
        if(self.action_space==[]):
            done=True
        else:
            self.env.step(['None',random.choice(self.action_space)])
            g=Game(self.env.state[0]['observation']['board']);
            if g.status==2:
                reward=-10
                done=True

        self.action_space=list(self.get_action())
        return self.env.state[0]['observation']['board'],reward,done

] कुल 64 वर्ग हैं, इसलिए मैंने प्रत्येक चाल के लिए 64*64 अद्वितीय अनुक्रमित होने का फैसला किया।

]

तंत्रिका नेटवर्क संरचना

आयात मशाल एनएन के रूप में टार्च को आयात करें इष्टतम के रूप में टार्च को आयात करें क्लास DQN (NN.MODULE): def __init __ (स्व): सुपर (dqn, स्व) .__ init __ () self.conv_layers = nn.ceptiential ( nn.conv2d (12, 32, kernel_size = 3, स्ट्राइड = 1, पैडिंग = nn.relu (), nn.conv2d (32, 64, kernel_size = 3, स्ट्राइड = 1, पैडिंग = 1), nn.relu () ) self.fc_layers = nn.cepentiential ( nn.flatten (), nn.linear (64 * 8 * 8, 256), nn.relu (), nn.linear (256, 128), nn.relu (), nn.linear (128, 4096) ) डीईएफ फॉरवर्ड (सेल्फ, एक्स): x = x.unsqueeze (0) x = self.conv_layers (x) x = self.fc_layers (x) X रिटर्न करें पूर्वानुमान (स्व, राज्य, वैध_एक्ट_इंडिस): Torch.no_grad () के साथ: q_values ​​= self.forward (राज्य) q_values ​​= q_values.squeeze (0) मान्य_क्यू_वैल्यूज़ = q_values ​​[मान्य_एक्ट_इंडिस] BEST_ACTION_RELATIVE_INDEX = VAIL_Q_VALUES.ARGMAX ()। आइटम () max_q_value = ralid_q_values.argmax () best_action_index = ralid_action_indices [best_action_relative_index] MAX_Q_VALUE, BEST_ACTION_INDEX लौटें

] एजेंट को लागू करना


] target_network = dqn ()। to (डिवाइस) # लक्ष्य q-network ऑप्टिमाइज़र = torch.optim.adam (model.parameters (), lr = 1e-4) replay_buffer = replaybuffer (बफ़र_सिज़ = 10000) एप्सिलॉन = 0.5 गामा = 0.99 batch_size = 15 डीईएफ ट्रेन (एपिसोड): रेंज में ईपी के लिए (1, एपिसोड 1): प्रिंट ('एपिसोड नंबर:', ईपी) myenv = envcust () किया = गलत राज्य = myenv.obs_space i = ० जबकि नहीं किया गया और मैं batch_size: mini_batch = replay_buffer.sample (batch_size) मिनी_बैच में ई के लिए: राज्य, कार्रवाई, इनाम, अगला_स्टेट, किया = ई जी = खेल (अगला_स्टेट) अधिनियम = g.get_moves (); ind_a = action_index (अधिनियम) input_state = torch.tensor (fen_to_board (next_state), dtype = torch.float32, आवश्यकताएँ_ग्राड = true) .to (डिवाइस) tpred, _ = target_network.predict (input_state, ind_a) लक्ष्य = इनाम गामा * tpred * (1 - किया) act_ind = uci_to_action_index (क्रिया) input_state2 = torch.tensor (fen_to_board (state), dtype = torch.float32, आवश्यकता है_ग्राड = true) .to (डिवाइस) current_q_value = model (input_state2) [0, act_ind] हानि = (current_q_value - लक्ष्य) ** 2 ऑप्टिमाइज़र.जेरो_ग्रैड () नुकसान ऑप्टिमाइज़र.स्टेप () यदि ep % 5 == 0: target_network.load_state_dict (model.state_dict ())

]

Building a Chess Agent using DQN

विज्ञप्ति वक्तव्य इस लेख को पुन: प्रस्तुत किया गया है: https://dev.to/ankit_upadhyay_1c38ae52c0/building-a-chess-agent-using-dqn-40po?1 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए [email protected] पर संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3