深圳市国外网站建设服务机构,南充免费推广网站,网站建设教程网站,广东深圳市宝安区0.简介 基于时序差分算法的强化学习算法除了Sarsa算法以外还有一种著名算法为Q-learning算法#xff0c;为离线策略算法#xff0c;与在线策略算法Sarsa算法相比#xff0c;其时序差分更新方式变为
Q(St,At)←Q(St,At)α[Rt1γmaxaQ(St1,a)−Q(St,At)]
对于 Sarsa 来说为离线策略算法与在线策略算法Sarsa算法相比其时序差分更新方式变为
Q(St,At)←Q(St,At)α[Rt1γmaxaQ(St1,a)−Q(St,At)]
对于 Sarsa 来说
1在状态 s 时就知道了要采取那个动作 a并且真的采取了这个动作2当前动作 a 和下一个动作 a 都是 根据 ϵ -贪婪策略选取的因此称为on-policy学习
对于 Q-Learning
1在状态s时只是计算了 在 s 时要采取哪个 a 可以得到更大的 Q 值并没有真的采取这个动作 a。2动作 a 的选取是根据当前 Q 网络以及 ϵ-贪婪策略即每一步都会根据当前的状况选择一个动作A目标Q值的计算是根据 Q 值最大的动作 a 计算得来因此为 off-policy 学习。 1.导入相关库
import matplotlib.pyplot as plt
import numpy as np
from tqdm import tqdm
2.悬崖漫步环境实现环节
class cliffwalking():def __init__(self,colnum,rownum,stepr,cliffr,initx,inity):self.colnumcolnumself.rownumrownumself.steprsteprself.cliffrcliffrself.initxinitxself.inityinityself.disasterlist(range((self.rownum-1)*self.colnum1,self.rownum*self.colnum-1))self.end[self.rownum*self.colnum-1]self.xself.initxself.yself.initydef step(self,action):change[[0,-1],[0,1],[-1,0],[1,0]]#change[0]上change[1]下change[2]左change[3]右坐标系原点(0,0)在左上角self.xmin(self.colnum-1,max(0,self.xchange[action][0]))self.ymin(self.rownum-1,max(0,self.ychange[action][1]))nextstateself.y*self.colnumself.xrewardself.steprdoneFalseif nextstate in self.disaster:rewardself.cliffrdoneTrueif nextstate in self.end:doneTruereturn nextstate,reward,donedef reset(self):self.xself.initxself.yself.inityreturn self.y*self.colnumself.x
3.Q-learning算法实现
class Qlearning(): Qlearning算法 def __init__(self,colnum,rownum,alpha,gamma,epsilon,actionnum4):self.colnumcolnumself.rownumrownumself.alphaalpha#学习率self.gammagamma#折扣因子self.epsilonepsilonself.actionnumactionnum#动作个数self.qtablenp.zeros([self.colnum*self.rownum,self.actionnum])def takeaction(self,state):if np.random.random()self.epsilon:actionnp.random.randint(0,self.actionnum)else:actionnp.argmax(self.qtable[state])return actiondef bestaction(self,state):qmaxnp.max(self.qtable[state])anp.where(self.qtable[state]qmax)return adef update(self,s0,a0,r,s1):tderrorrself.gamma*np.max(self.qtable[s1])-self.qtable[s0][a0]self.qtable[s0][a0]self.alpha*tderror
4.打印目标策略函数
def printtheagent(agent,env,actionmeaning):for i in range(env.rownum):for j in range(env.colnum):if (i*env.colnumj) in env.disaster:print(****,end )elif (i*env.colnumj) in env.end:print(EEEE,end )else:aagent.bestaction(i*env.colnumj)b[0 for _ in range(len(actionmeaning))]for m in range(len(actionmeaning)):b[m]1 if m in a else 0 pistrfor k in range(len(actionmeaning)):pistractionmeaning[k] if b[k]0 else oprint(%s%pistr,end )print()
5.相关参数设置
ncol12#悬崖漫步环境中的网格环境列数
nrow4#悬崖漫步环境中的网格环境行数
step_reward-1#每步的即时奖励
cliff_reward-100#悬崖的即时奖励
init_x0#智能体在环境中初始位置的横坐标
init_ynrow-1#智能体在环境中初始位置的纵坐标
alpha0.1#价值估计更新的步长
epsilon0.1#epsilon-贪婪算法的探索因子
gamma0.9#折扣衰减因子
num_episodes500#智能体在环境中运行的序列总数
tqdm_num10#进度条的数量
printreturnnum10#打印回报的数量
actionmeaning[↑,↓,←,→]#上下左右表示符6.程序主体部分实现
np.random.seed(5)
returnlist[]
envcliffwalking(colnumncol,rownumnrow,steprstep_reward,cliffrcliff_reward,initxinit_x,inityinit_y)
agentQlearning(colnumncol,rownumnrow,alphaalpha,gammagamma,epsilonepsilon,actionnum4)
for i in range(tqdm_num):with tqdm(totalint(num_episodes/tqdm_num)) as pbar:for episode in range(int(num_episodes/tqdm_num)):episodereturn0stateenv.reset()doneFalsewhile not done:actionagent.takeaction(state)nextstate,reward,doneenv.step(action)episodereturnrewardagent.update(state,action,reward,nextstate)statenextstatereturnlist.append(episodereturn)if (episode1)%printreturnnum0:pbar.set_postfix({episode:%d%(num_episodes/tqdm_num*iepisode1),return:%.3f%(np.mean(returnlist[-printreturnnum:]))})pbar.update(1)
episodelistlist(range(len(returnlist)))
plt.plot(episodelist,returnlist)
plt.xlabel(Episodes)
plt.ylabel(Returns)
plt.title(Qlearning on{}.format(Cliff Walking))
plt.show()
print(Qlearning算法最终收敛得到的策略为:)
printtheagent(agentagent,envenv,actionmeaningactionmeaning)
7.结果展示 Iteration 0: 100%|████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:0000:00, 428.50it/s, episode50, return-114.000] Iteration 1: 100%|████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:0000:00, 895.23it/s, episode100, return-72.500] Iteration 2: 100%|███████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:0000:00, 1222.78it/s, episode150, return-66.100] Iteration 3: 100%|███████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:0000:00, 1519.26it/s, episode200, return-40.000] Iteration 4: 100%|███████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:0000:00, 1533.70it/s, episode250, return-26.600] Iteration 5: 100%|███████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:0000:00, 1925.46it/s, episode300, return-38.000] Iteration 6: 100%|███████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:0000:00, 2387.50it/s, episode350, return-47.000] Iteration 7: 100%|███████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:0000:00, 2949.12it/s, episode400, return-25.500] Iteration 8: 100%|███████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:0000:00, 3133.12it/s, episode450, return-34.000] Iteration 9: 100%|███████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:0000:00, 3133.44it/s, episode500, return-60.400] Qlearning算法最终收敛得到的策略为: ↑ooo o↓oo ooo→ o↓oo ooo→ ooo→ ooo→ ooo→ o↓oo ooo→ o↓oo o↓oo o↓oo ooo→ ooo→ ooo→ ooo→ ooo→ o↓oo ooo→ o↓oo ooo→ ooo→ o↓oo ooo→ ooo→ ooo→ ooo→ ooo→ ooo→ ooo→ ooo→ ooo→ ooo→ ooo→ o↓oo ↑ooo **** **** **** **** **** **** **** **** **** **** EEEE 8.总结 打印出的回报是行为策略在环境中交互得到的而不是Q-learning算法在学习的目标策略的真实回报目标策略打印出来如上所示发现其更偏向于走在悬崖边上这与Sarsa算法得到的比较保守的策略相比更优。 比较Sarsa算法与Q-learnig算法在训练中的回报曲线图可以发现在一个序列中Sarsa算法获得期望回报高于Q-learning算法原因是训练过程中智能体采取基于当前Q(s,a)函数的-贪婪策略来平衡探索与利用Q-learning算法由于沿着悬崖边走会以一定的概率探索“掉入悬崖”这一动作而Sarsa相对保守的路线使得智能体几乎不可能掉入悬崖。