Игра "плагин"? ——Самая сильная стратегия для игр, созданных ИИ

искусственный интеллект

Как счастливый толстый дом, дома обязательно нужно играть в игры, будь то популярные игры, такие как King of Glory, Chicken Eating, Yuanshen или прыжки, синтез большого арбуза, 2048, эти популярные маленькие игры, в которых мы все участвовали. Но для того, чтобы стать "игроком номер один", я всегда схожу с ума по различным сообществам и веб-сайтам, чтобы найти различные стратегии и расти вместе со стратегиями. Я часто думаю, когда я стану богом стратегии поколений, пусть все у меня учатся. Технологии, разве это не захватывающе!

Вспышка вдохновения, все-таки я толстяк с технологиями понемногу.Раньше был одержим дипмайндом и запускал AlphaGo.Не надо обучать ИИ играть.

Обучение с подкреплением тренирует игру 2048 и наблюдает, как ИИ находит выход.

Поскольку вы хотите потренироваться, давайте начнем с простой игры, такой как 2048, которая не проверяет работу и чистую стратегию. После поиска в Интернете я нашел игровую среду 2048 с открытым исходным кодом.

Адрес гитхаба:GitHub.com/as curry/gym-20…

Следующим шагом является объединение этого алгоритма с обучением с подкреплением.

Алгоритмическая часть очень проста, в настоящее время я использую самый традиционный DQN и могу добиться приличного модельного эффекта за 10 минут. Если у вас есть идеи, вы можете попробовать такие алгоритмы, как RainBow, PPO, A2C и SAC, и я верю, что вы получите лучшие результаты.

Я разработал эту модель, используяМодельArts of HUAWEI CLOUD(Это готовая онлайн-платформа искусственного интеллекта и бесплатная вычислительная мощность графического процессора, которую можно использовать неограниченное количество раз в день, не переусердствуйте!), поэтому код запускается в ipynb.

Общие шаги можно условно разделить на 3 этапа:

1. Создайте игровое окружение

2. Создайте алгоритм DQN

def learn(self, buffer):
        # 当replaybuffer中存储的数据大于batchsize时,从中随机采样一个batch的数据学习
        if buffer.size >=self.args.batch_size:
            # 更新target_model的参数
            if self.learn_step_counter %args.target_update_freq == 0:
               self.target_model.load_state_dict(self.behaviour_model.state_dict())
            self.learn_step_counter += 1
 
            # 从replaybuffer中随机采样一个五元组(当前观测值,动作,下一个观测值,是否一局结束,奖励值)
            s1, a, s2, done, r =buffer.get_sample(self.args.batch_size)
            s1 =torch.FloatTensor(s1).to(device)
            s2 = torch.FloatTensor(s2).to(device)
            r = torch.FloatTensor(r).to(device)
            a = torch.LongTensor(a).to(device)
 
            if args.use_nature_dqn:
                q =self.target_model(s2).detach()
            else:
                q = self.behaviour_model(s2)
            # 每个动作的q值=r+gamma*(1-0或1)*q_max
            target_q = r +torch.FloatTensor(args.gamma * (1 - done)).to(device) * q.max(1)[0]
            target_q =target_q.view(args.batch_size, 1)
            eval_q = self.behaviour_model(s1).gather(1,torch.reshape(a, shape=(a.size()[0], -1)))
            # 计算损失函数
            loss = self.criterion(eval_q,target_q)
            self.optimizer.zero_grad()
            loss.backward()
            self.optimizer.step()
 
    def get_action(self, state, explore=True):
        # 判断是否探索,如果探索,则采用贪婪探索策略决定行为
        if explore:
            if np.random.uniform() >=args.epsilon:
                action = randint(0,self.action_dim - 1)
            else:
                # Choose the best action accordingto the network.
                q =self.behaviour_model(torch.FloatTensor(state).to(device))
                m, index = torch.max(q, 1)
                action =index.data.cpu().numpy()[0]
        else:
            q = self.behaviour_model(torch.FloatTensor(state).to(device))
            m, index = torch.max(q, 1)
            action =index.data.cpu().numpy()[0]
 
        return action
 
 
classReplayBuffer:
    def __init__(self, buffer_size, obs_space):
        self.s1 = np.zeros(obs_space, dtype=np.float32)
        self.s2 = np.zeros(obs_space,dtype=np.float32)
        self.a = np.zeros(buffer_size,dtype=np.int32)
        self.r = np.zeros(buffer_size,dtype=np.float32)
        self.done = np.zeros(buffer_size,dtype=np.float32)
 
        # replaybuffer大小
        self.buffer_size = buffer_size
        self.size = 0
        self.pos = 0
 
    # 不断将数据存储入buffer
    def add_transition(self, s1, action, s2,done, reward):
        self.s1[self.pos] = s1
        self.a[self.pos] = action
        if not done:
            self.s2[self.pos] = s2
        self.done[self.pos] = done
        self.r[self.pos] = reward
 
        self.pos = (self.pos + 1) %self.buffer_size
        self.size = min(self.size + 1,self.buffer_size)
 
    # 随机采样一个batchsize
    def get_sample(self, sample_size):
 i = sample(range(0, self.size), sample_size)
        return self.s1[i], self.a[i],self.s2[i], self.done[i], self.r[i]

3. Создайте сетевую модель

Здесь я использую очень простую трехслойную сверточную сеть.

classNet(nn.Module):
    #obs是状态空间输入,available_actions_count为动作输出维度
    def __init__(self, obs,available_actions_count):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(obs, 128,kernel_size=2, stride=1)
        self.conv2 = nn.Conv2d(128, 64,kernel_size=2, stride=1)
        self.conv3 = nn.Conv2d(64, 16,kernel_size=2, stride=1)
        self.fc1 = nn.Linear(16,available_actions_count)
        self.relu = nn.ReLU(inplace=True)
 
    def forward(self, x):
        x = x.permute(0, 3, 1, 2)
        x = self.relu(self.conv1(x))
        x = self.relu(self.conv2(x))
        x = self.relu(self.conv3(x))
        x = self.fc1(x.view(x.shape[0], -1))
        return x

Выполнив три вышеуказанных шага, вы можете с радостью приступить к тренировкам:

print('\ntraining...')
begin_t= time.time()
max_reward= 0
fori_episode in range(args.epochs):
    # 每局开始,重置环境
    s = env.reset()
    # 累计奖励值
    ep_r = 0
    while True:
        # 计算动作
        a = dqn.get_action(np.expand_dims(s,axis=0))
        # 执行动作
        s_, r, done, info = env.step(a)
        # 存储信息
        memory.add_transition(s, a, s_, done,r)
        ep_r += r
        # 学习优化过程
        dqn.learn(memory)
 
        if done:
            print('Ep: ', i_episode,
                  '| Ep_r: ', round(ep_r, 2))
            if ep_r > max_reward:
                max_reward = ep_r
                print("current_max_reward{}".format(max_reward))
                # 保存模型
                torch.save(dqn.behaviour_model,"2048.pt")
            break
        s = s_
print("finish!time cost is {}s".format(time.time() - begin_t))

Я тренировался всего 10 минут.В этой строгой среде, где я не могу ошибаться, я могу набрать 256 баллов в выводе.Если использовать более продвинутые алгоритмы и более длительное время обучения, 2048 не мечта.

Подробный метод получения кода: щелкните эту ссылку, чтобы запустить его непосредственно в Интернете, или загрузитеmarketplace.huaweicloud.com/markets/hobby…

Источником этой технологии является то, с чем я столкнулся в прошлогоднем плане развития полного стека HUAWEI CLOUD AI.Говорят, что в этом году HUAWEI CLOUD начал новый раунд [боевых лагерей AI].Шесть основных категорий практические боевые лагеря Python, ModelArts, ИИ-фреймворк MindSpore, глубина, подкрепление и машинное обучение помогают нам стать «королем ИИ»! **Изучая всеобъемлющие знания об искусственном интеллекте в короткие сроки, вы также можете получить Mate 30Pro, умные часы, беспроводные наушники и другие подарки-сюрпризы! Я отсканировал QR-код ниже, чтобы зарегистрироваться~ Вам еще нужно ждать?

Нажмите «Подписаться», чтобы впервые узнать о новых технологиях HUAWEI CLOUD~