解决这种DQN代理的最佳方法是什么



我是强化学习和深度学习的初学者,对我来说很简单^^

假设我们在Keras中有一个DQN代理,它接收一个0和1的2D矩阵输入,假设它有10行3列。

此矩阵是10个用户(行数(的请求矩阵,如果其中一列的值等于1,则意味着用户正在向代理请求要提供给该用户的资源。

示例:

[
[0, 1, 0],
[0, 0, 0],
[1, 0, 0],
[0, 0, 1],
...
]

在接收到输入矩阵后,代理必须为提出请求的用户提供资源,而不为没有提出要求的用户提供任何资源。

假设代理有12个可以分配的资源。我们可以将资源分配表示为具有12行(资源数量(和10列(用户数量(的2D矩阵。

每个资源只能提供给一个用户,每个用户在每个步骤中只能使用一个资源。

我试过这个问题,这和我的问题类似,但当我运行代码时,q_values(或weights?(被分配给输出矩阵每行的每一列,我想要的是将q_value分配给整个矩阵,或者至少这是我的初学者大脑告诉我要做的。

动作(输出(矩阵可以是这样的:

[
[1, 0, 0, 0, 0, ...]
[0, 0, 0, 0, 0, ...],
[0, 0, 0, 1, 0, ...],
...
]

我的一个想法是从矩阵(动作(集合中进行选择,但集合非常大,我无法存储它,因为它会给我一个MemoryError。

我仍然困惑于解决这一困境的最佳方法是什么

最简单的方法是使用n_users-dimensional动作向量定义DQN代理。该动作向量的每个条目都应该是一个整数x in [-1, n_resources)x == -1表示没有分配给此用户的资源,而0 <= x < n_resources表示分配给该用户的第x个资源。因此,您的示例操作输出将表示为:

[0, -1, 3, ...]

如果代理试图将同一资源分配给两个代理,则将其标记为非法操作。这样做的问题是,你的非法行为空间很大(用户数量的因子(。

另一种方法是完全改变你的问题体系结构,并有一个一次为人们分配资源的。代理显然需要某种内存来分配它所分配的资源。这样你的行动和非法行动结构就简单多了。在这种情况下,一个事件将由n_users时间步长组成,在每个时间步长,代理与环境交互,并查看当前用户的请求及其已分配的资源。

相关内容

最新更新