不用强化学习工具箱的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