首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >联合强化学习

联合强化学习
EN

Stack Overflow用户
提问于 2021-03-30 17:37:48
回答 1查看 74关注 0票数 0

我使用多个代理,使用多个代理,每个代理运行,通过PyTorch实现联合的深度Q学习。我的问题是,当我对代理使用多个重放缓冲器时,每个代理都在相应的代理处附加经验,每个代理重放缓冲区中的两个经验元素,即"current_state“和"next_state"在第一个时隙后变得相同。我的意思是在每个缓冲区中,我们看到当前状态的相同值和下一个状态的相同值。我已经包含了代码的简化部分和下面的结果。当执行追加时,它为什么要更改当前状态和下一个状态?将缓冲区定义为全局变量有什么问题吗?还是你有别的主意?

代码语言:javascript
复制
<<< time 0 and agent 0:
current_state[0] = [1,2]
next_state[0] = [11,12]
*** experience: (array([ 1., 2.]), 2.0, array([200]), array([ 11., 12.]), 0)
*** buffer: deque([(array([ 1., 2.]), 2.0, array([200]), array([ 11., 12.]), 0)], maxlen=10000)

<<< time 0 and agent 1: 
current_state[1] = [3, 4]
next_state[1] = [13, 14]
*** experience: (array([ 3., 4.]), 4.0, array([400]), array([ 13., 14.]), 0)
*** buffer: deque([(array([ 1., 2.]), 4.0, array([400]), array([ 11., 12.]), 0)], maxlen=10000)

<<< time 1 and agent 0:
current_state = [11,12]
next_state[0] = [110, 120]
*** experience: (array([ 11., 12.]), 6.0, array([600]), array([ 110., 120.]), 0)
*** buffer: deque([(array([ 11., 12.]), 2.0, array([200]), array([ 110., 120.]), 0),(array([ 11., 12.]), 6.0, array([600]), array([ 110., 120.]), 0)], maxlen=10000)

<<< time 1 and agent 1:
current_state = [13, 14]
next_state[1] = [130, 140]
*** experience: (array([ 13., 14.]), 8.0, array([800]), array([ 130., 140.]), 0)
*** buffer: deque([(array([ 13., 14.]), 4.0, array([400]), array([ 130., 140.]), 0),(array([ 13., 14.]), 8.0, array([800]), array([ 130., 140.]), 0)], maxlen=10000)
代码语言:javascript
复制
class BasicBuffer:
def __init__(self, max_size):
    self.max_size = max_size
    self.buffer = deque(maxlen=10000)

def add(self, current_state, action, reward, next_state, done):
    ## """"Add a new experience to buffer.""""
    experience = (current_state, action, np.array([reward]), next_state, done)
    self.buffer.append(experience)

def DQNtrain(env, state_size, agent):
for time in range(time_max):
    for e in range(agents_numbers):
       current_state[e,:]
        next_state_edge[e, :] 
        ## """"Add a new experience to buffer.""""
        replay_buffer_t[e].add(current_state, action, reward, next_state, done)
        current_state[e, :] = next_state[e, :]

if __name__ == '__main__':
   DQNtrain(env, state_size, agent)
   replay_buffer_t = [[] for _ in range(edge_max)]
   for e in range(edge_max):
       replay_buffer_t[e] = BasicBuffer(max_size=agent_buffer_size)
EN

回答 1

Stack Overflow用户

发布于 2021-03-31 05:34:10

我刚发现是什么引起了问题。我应该在体验中使用copy.deepcopy():

代码语言:javascript
复制
experience = copy.deepcopy((current_state, action, np.array([reward]), next_state, done))
self.buffer.append(experience)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66875831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档