Q-learning是强化学习中一种入门级的经典算法。基本思想是对所有状态下的对应动作进行打分,依据最高的分值选择动作。打分的依据是Q表,其中存储了所有状态下动作的分值,Q表通过数据训练而来。Q-learning的优势在于融合了动态规划和蒙特卡洛,构造了时间差分的Q值更新公式,其更新公式如下:
#-----------------------------------调用模块-----------------------------------
import pandas as pd
import numpy as np
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
import random
#-----------------------------------Q表R表-----------------------------------
Q=np.array([[0 for i in range(6)] for j in range(6)])
Q[5][5]=100
R=np.array([[-100 for i in range(6)] for j in range(6)])
R[0][4]=0
R[1][3]=0
R[1][5]=100
R[2][3]=0
R[3][2]=0
R[3][1]=0
R[3][4]=0
R[4][0]=0
R[4][3]=0
R[4][5]=100
R[5][1]=0
R[5][4]=0
R[5][5]=100
#-----------------------------------基本参数-----------------------------------
samples=1000;#训练样本
lr=0.1#学习率
r=0.8#折扣系数
e0=0.5#决策贪婪参数
#-----------------------------------函数区域-----------------------------------
#随机策略训练模型
def Q_random_train(samples,lr,r):
for i in range(samples):
s1=random.randint(0,5)
s2=random.randint(0,5)
Q[s1][s2]+=lr*(R[s1][s2]+r*Q[s2].max()-Q[s1][s2])
#贪婪策略训练模型
def Q_greedy_train(samples,lr,r):
for i in range(samples):
s1=random.randint(0,5)
e_=random.random()
e=i/(1.1*samples)
if e_>e:s2=random.randint(0,5)
else:s2=Q[s1].argmax()
Q[s1][s2]+=lr*(R[s1][s2]+r*Q[s2].max()-Q[s1][s2])
#最优策略
def Q_optimal(s1,s2):
path=[s1]
while 1:
s1=Q[s1].argmax()
if s1==s2:
path.append(s1)
break
if s1 in path:
path.clear()
break
path.append(s1)
return path
#-----------------------------------结果区域-----------------------------------
Q_greedy_train(samples,lr,r)
Q_optimal(0,5)
最短路径问题
问题
求0-4的最短路径
#-----------------------------------调用模块-----------------------------------
import pandas as pd
import numpy as np
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
import random
#-----------------------------------Q表R表-----------------------------------
Q=np.zeros([9,9])
for i in range(9):Q[4][4]=100
R=dict()
R[(0,1)]=R[(1,0)]=-4
R[(0,7)]=R[(7,0)]=-8
R[(1,2)]=R[(2,1)]=-8
R[(1,7)]=R[(7,1)]=-11
R[(2,3)]=R[(3,2)]=-7
R[(2,5)]=R[(5,2)]=-4
R[(2,8)]=R[(8,2)]=-2
R[(3,4)]=R[(4,3)]=-9
R[(3,5)]=R[(5,3)]=-14
R[(4,5)]=R[(5,4)]=-10
R[(5,6)]=R[(6,5)]=-2
R[(6,7)]=R[(7,6)]=-1
R[(6,8)]=R[(8,6)]=-6
R[(7,8)]=R[(8,7)]=-7
#-----------------------------------基本参数-----------------------------------
samples=10000;#训练样本
lr=0.1#学习率
r=1#折扣系数
#-----------------------------------函数区域-----------------------------------
#随机策略训练模型
def Q_random_train(samples,lr,r):
for i in range(samples):
act=random.choice(list(R.keys()))
s1=act[0]
s2=act[1]
Q[s1][s2]+=lr*(R[act]+r*Q[s2].max()-Q[s1][s2])
#最优策略
def Q_optimal(s1,s2):
path=[s1]
while 1:
s1=Q[s1].argmax()
if s1==s2:
path.append(s1)
break
if s1 in path:
path.clear()
break
path.append(s1)
return path
#-----------------------------------结果区域-----------------------------------
Q_random_train(samples,lr,r)
Q_optimal(0,4)
决策树拟合Q表
为了进一步深入到DQN的学习,首先尝试使用决策树或者深度网络拟合Q表,方便起见选择决策树。
#-----------------------------------训练数据-----------------------------------
x=np.array([[[j,i] for i in range(9)] for j in range(9)]).reshape(-1,2)
y=Q.reshape(-1)
#-----------------------------------模型训练-----------------------------------
regressor=DecisionTreeRegressor(max_depth=8)
regressor.fit(x,y)
#-----------------------------------结果可视化-----------------------------------
p_y=regressor.predict(x)
plt.figure(figsize=[20,5])
plt.plot(y)
plt.plot(p_y)
当决策树的深度分别为3、5、8时,拟合效果如下所示。可以看到,基本决策树的拟合效果比较差,深度较深的时候处于过拟合严重的状态。初步考虑是由于问题过于简单,数据量较少造成的。但是按理说问题内部有相应逻辑,简单网络应该能够拟合出来,而实际情况是,简单网络拟合不出效果,复杂网络严重过拟合。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)