手动用MATLAB实现Policy Gradient

不用强化学习工具箱的PG算法案例与matlab代码

项目下载链接

PG相关理论知识

目前网上有很多相关的知识介绍和相关推导,小编这里就不在介绍了点击这里

PG算法跟Q学习和DQN算法相比优势

1. 首先Q学习、DQN算法是通过计算动作得分来决策的,我们是在确定价值函数的基础上采用某种策略选取动作,而PG算法直接优化policy。
2. DQN之类的方法一般都是只处理离散动作,无法处理连续动作。虽然有NAF DQN之类的变通方法,但是并不优雅。但是用Policy Based强化学习方法却很容易建模。
3. 对受限状态下的问题处理能力不足。在使用特征来描述状态空间中的某一个状态时,有可能因为个体观测的限制或者建模的局限,导致真实环境下本来不同的两个状态却再我们建模后拥有相同的特征描述,进而很有可能导致我们的value Based方法无法得到最优解。此时使用Policy Based强化学习方法也很有效。
4. 无法解决随机策略问题。Value Based强化学习方法对应的最优策略通常是确定性策略,因为其是从众多行为价值中选择一个最大价值的行为,而有些问题的最优策略却是随机策略,这种情况下同样是无法通过基于价值的学习来求解的。这时也可以考虑使用Policy Based强化学习方法。

案例说明:

环境设置:这是一个30*30的矩阵迷宫,其中有两个状态obstacle(15,15),Goal(25,25),目标就是Agent如何不碰到障碍物可以到达Goal.
奖励设置:当Agent到达obstacle状态时reward=-1;当Agent到达Goal状态时reward=1;其他状态下reward=0.
状态设置:所在方块中x,y为状态;
动作设置:上,下,左,右。并且设置了随机性,当选动作上时,有80%概率选择上,10%概率选择左,10%概率选择右。
通过不断的学习使得Agent能够选择最优路径。

话不多说我们上代码这里只提供一部分,全部的会上传到资源上)代码已上传,大家可以在此基础上直接修改变成自己的项目。

addpath('../Environment');
addpath('../Basic Functions');
env = SAEnvironment;

alpha = 0.1; %learning rate settings 
gamma = 0.9; %discount factor
maxItr = 3000;%maximum iterations for ending one episode

p_estimator = PolicyEstimator(env,alpha);
v_estimator = ValueEstimator(env,alpha);

if isTraining
    NUM_ITERATIONS = 100000; %change this value to set max iterations
    iterationCount(NUM_ITERATIONS) = 0;
    rwd(NUM_ITERATIONS) = 0;
else
    NUM_ITERATIONS = 5;
    if isTesting
        NUM_ITERATIONS = 200;
        iterationCount(NUM_ITERATIONS) = 0;
        rwd(NUM_ITERATIONS) = 0;
    end
    load('policy_weights.mat','-mat');
    load('value_weights.mat','-mat');
    p_estimator.set_weights(policyWeights);
    v_estimator.set_weights(valueWeights);
end

for itr=1:NUM_ITERATIONS 
    env.reset([0 0]);
    if ~isTraining && ~isTesting 
		env.reset(env.locA);
        env.render();%display the moving environment
    end

    countActions = 0;%count how many actions in one iteration  
    reward = 0;
    done = false;
    state = env.current_location;
    fprintf('initial location: %d, %d\n',env.current_location);
    
    while ~done   
        if countActions == maxItr
            break;
        end
        countActions = countActions + 1; 
        
        if ~isTraining
            prob_a = p_estimator.predict(state,env.actionSpace);
            action = randsample(env.actionSpace,1,true,prob_a);
            [next_state, reward, done] = env.step(action);
            state = next_state;
            if ~isTesting
                env.render();%display the moving environment
            end
            continue;
        end
        
        prob_a = p_estimator.predict(state,env.actionSpace);
        action = randsample(env.actionSpace,1,true,prob_a);
        
        [next_state, reward, done] = env.step(action);
                
        
        if ~done
            td_err = reward + gamma*v_estimator.predict(next_state) - v_estimator.predict(state);
        else
            td_err = reward - v_estimator.predict(state);
        end
        
        v_estimator.update(state,td_err);
        p_estimator.update(state,action,td_err);
        
        state = next_state;
    end
    fprintf('final location: %d, %d\n', state);
    fprintf('%d th iteration, %d actions taken, final reward is %d.\n',itr,countActions,reward);
    if isTraining || isTesting
        iterationCount(itr) = countActions;
        rwd(itr) = reward;
    end
end

if isTraining
    policyWeights = p_estimator.weights;
    valueWeights = v_estimator.weights;
    disp("policy weights:");
    disp(policyWeights);
    fprintf('value weights: %d, %d, %d\n',valueWeights);
    save('policy_weights.mat','policyWeights');
    save('value_weights.mat','valueWeights');
    save('pg_iterationCount.mat','iterationCount');
    save('pg_reward.mat','rwd');
    figure,bar(iterationCount)
    figure,bar(rwd)
end
if isTesting
    figure,bar(iterationCount)
    meanA = num2str(mean(iterationCount));
    title(strcat('Mean steps: ',meanA));
    figure,bar(rwd)
end
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
DDPG(Deep Deterministic Policy Gradient)是一种用于连续动作空间的强化学习算法,可以用于解决许多控制问题。在DDPG算法中,策略网络的参数更新需要计算policy gradient梯度。 在MATLAB中,我们可以利用深度学习工具箱来实现DDPG算法。下面是计算DDPG策略网络的policy gradient的步骤: 1. 首先,定义和初始化DDPG的网络架构,包括策略网络和值函数网络。策略网络参数化了一个确定性策略π,输入为状态s,输出为动作a。值函数网络是为了辅助策略网络的训练,输入为状态s和动作a,输出为对应的Q值。 2. 使用现有的经验回放缓冲池,从中随机选择一定数量的样本。每个样本包含当前状态s,选定的动作a,奖励r,下一状态s'以及一个指示终止状态的标志位done。 3. 对于选定的每个样本,使用策略网络计算当前状态s下的动作a,并计算其对应的Q值。 4. 将计算得到的动作a和Q值作为目标,使用值函数网络对当前状态s和动作a进行预测得到Q值的估计。 5. 利用目标Q值和估计Q值的差异,计算出policy gradient梯度。 6. 利用计算得到的梯度来更新策略网络的参数,使得策略网络的输出更适应目标Q值。 7. 重复以上步骤,直至达到收敛条件或指定的训练轮数。 以上是MATLAB中计算DDPG策略网络的policy gradient的一般步骤。具体实现还需要根据具体的问题和网络架构进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大橙子老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值