杉果游戏官网

您现在的位置是:首页 > 新闻动态 > 杉果游戏官网_观察AI如何找到出口 强化游戏体验

杉果游戏官网_观察AI如何找到出口 强化游戏体验

文章来源:杉果游戏官网  作者:杉果游戏官网  发布日期:2021-10-10  浏览次数:934  【打印】  【关闭】   【返回

作为一位欢愉的肥宅,玩游戏是居家必备,不管是王者光荣、吃鸡、原神这些年夜热游戏,仍是跳一跳、合成年夜西瓜、2048、这些风行一时得小游戏,咱都有触及。可是为了成为一个“头号玩家”,我老是疯狂的去个各年夜社区、网站寻觅各类攻略,随着攻略成长,我经常在想,甚么时辰俺才能成为一代攻略年夜神啊,让大师进修我的手艺,岂不是很刺激!

灵光一闪,究竟我是个有点小手艺的肥宅,曾也痴迷过deepmind,跑过AlphaGo,这不得练习一个AI玩一玩。

强化进修练习2048游戏,

不雅察AI若何找到出口?

既然要练手,那就先从2048这类简单,不考验操作,纯策略的游戏入手吧。在网上搜罗了一番,公然让我找到了开源的2048游戏情况,GitHub地址:

https://github.com/rgal/gym-2048。

下一步就是把这个算法和强化进修连系了。

算法部门很简单,今朝我才用的是最传统的DQN,10分钟便可以到达一个还可以的模子结果。假如小火伴们有设法,可以尝尝RainBow,PPO,A2C,SAC这类算法,相信会取得更佳的结果。

我开辟这个模子,用的是来自华为云的ModelArts(它是一个在线、开箱即用的AI平台,还免费的GPU算力,天天不限次数利用,不要太爽!),所以代码是在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(‘

training.。。’)begin_t= time.time()max_reward= 0fori_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不是梦。

具体代码获得体例:

经由过程此链接可直接在线运行,或下载

https://marketplace.huaweicloud.com/markets/aihub/notebook/detail/?id=3a11d09b-85f5-4ae4-b4a7-9b19be2b444d

这个手艺来历是我在客岁华为云AI全栈成长打算中接触到的,听说本年华为云又最先了新一轮【AI实战营】,6年夜分类实战营Python、ModelArts、MindSpore AI框架、深度、强化、机械进修,助我们成为“AI王者”!

编纂:jq

Copyright © 2020 Shanghai Lineprinting Materials Co., ltd. All rights reserved .
Tel: (+86)21-57760077 Address:No.945,Huifu road, Waigang Town, Jiading District, Shanghai