第一次结对编程作业

試著忘記壹切 提交于 2019-11-30 05:42:31

问题重述与分析

问题重述

最终的黄金点比赛会进行10000轮。每轮比赛中共有 $N$ 位玩家参与,每个玩家要在 5s 内提交两个数,系统会将所有数作平均并乘0.618得到一个黄金点。提交数字最接近黄金点的玩家得 N 分,距离最远的 -2 分,其余玩家得分不变。目标是让累计得分尽量高。

问题分析

我们认为策略驱动模型更适合这个任务,而不是数据驱动。即根据历史数据从若干个给定策略中挑选一个作为回答,而不是直接去回归黄金点。比起直接回归策略,策略驱动的方法 action 空间更小,学习起来要简单一些。而至于用于策略选择的模型,我们尝试采用了 DQN(虽然两人都没怎么接触过,但这不失为一次学习的机会)。

Bot 算法设计

算法描述

我们的 Bot 是基于老师给的 RLDemo 修改的。

Action 空间 RLDemo 中给定了 8 个 action,其中前七个都是根据固定策略生成两个相同的数。我们觉得这样做有些“浪费”,因为若可以提交两个数,提交两个不同的数要更保险一些。我们便将前七个策略两两组合,再加上第八个策略,构成了一个大小为 C(7, 2) + 1 = 22 的 Action 空间。

State 我们简单地采用前十个黄金点组成的 10 维向量作为 State。

我们设计了一个简单的三层网络作为 DQN 的模型

class DQN(nn.Module):

    def __init__(self, state_size, action_size, mid_dim=128):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(state_size, mid_dim),
            nn.ReLU(inplace=True),
            nn.Linear(mid_dim, mid_dim),
            nn.ReLU(inplace=True),
            nn.Linear(mid_dim, action_size)
        )

    def forward(self, x):
        return self.net(x)

一个 DQN 实例 model 即对应着 Q-learning 中的 Q-Table。model(state)[action_id] 即可得到状态为 state,策略为 action_id 的 Q 值。

我们采用在线的方式训练模型。在前期数据量不足时,我们使用随机选取 Action 的策略;当数据量丰富后,我们以一定的概率决定应该采用 DQN 还是随机选取策略。若使用 DQN,我们会先从历史数据中选取一个 batch 对 DQN 做一次训练,再 eval DQN 得到预测的策略。

流程图

动机

其实我们并没有特别明确的动机,一方面我们需要一个较大的策略空间,另一方面我们需要一个不算太简单的策略选择机制。以上的模型是我们尝试的结果。

结果分析

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!