PaddlePaddle / PARL

A high-performance distributed training framework for Reinforcement Learning
https://parl.readthedocs.io/
Apache License 2.0
3.25k stars 820 forks source link

MADDPG多维离散动作处理 #1035

Closed haotiantianya closed 1 year ago

haotiantianya commented 1 year ago

你好~我最近在研究MADDPG处理多维离散动作。我在MADDPG官方源码中看到有俩中离散动作类型:discrete类、multidiscrete类。但是我现在在实验过程中采用multidiscrete类并没有取得好的结果我。我的一个动作是10维的,每个维度只有0和1两种选择,限制条件为每个动作输出只能有两个维度的值 为1,其它为0。我采用multidiscrete类处理,定义[min,max]为0和1,输出为10个小数,然后我选择了十个小数中最大两个的数对应的序列号为默认为1,请问可以这样处理吗?如果这样不对,请问有别的方法吗?

TomorrowIsAnOtherDay commented 1 year ago

以下答复部分来自chatGPT 你可以将你的多维离散动作视为一个一维的动作空间,每个动作是一个长度为10的向量,其中只有两个维度为1,其余为0。你可以将这个向量展平为一个长度为2^10=1024的向量,其中每个元素对应一个长度为10的向量,表示这个向量是不是你想要的动作。

haotiantianya commented 1 year ago

你好,谢谢您的回答,但是这样动作空间不是太大了么。我现在的模型是一个动作为120维,每个维度还是0和1两种选择,我有8个agent。我采用了multi discrete类,high定义为1,low定义为0,用gubelsoftmax采样方法,我的维度就变为240维。若gubelsoftmax采样输出的动作中1个数超过15的,我在环境中随机选择15个1作为实际动作,代码为: `def get_obs_s_n(action_n, t): obs_s_n = [] for i in range(8): actList = action_n[i]

print(len(actList))

    actList1 = [actList[j:j+2] for j in range(0, len(actList), 2)]
    obs_s = []

    for j in range(len(actList1)):
        if actList1[j][0]<actList1[j][1]:
            obs_s.append(j)
    if len(obs_s) > 15:
        obs_s = sample(list(obs_s), 15)
        mask=np.zeros(240)
        for m in obs_s:
            mask[2*m]=1
            mask[2*m+1]=1
        #print(len(mask))
        action_n[i]=np.multiply(actList,mask)
    elif len(obs_s) < 15:
        zero = np.zeros(len(obs_s)-15)
        obs_s = obs_s.extend(zero)
        action_n[i]=action_n[i]

    #print(obs_s)
    obs_s_n.append(obs_s)
return obs_s_n, action_n`

但是现在我的reward几乎不发生变化,只会在很小的范围波动,一直没有上升趋势,请问该如何解决呢。

zxb-0 commented 4 months ago

你好,请问如果把maddpg用于离散空间,算法是不是需要改动很多呢