唔~B站果然是个学习的好地方,里面的阿婆主个个都是人才,讲话又好听
import pandas as pd import numpy as np import time
头文件。
Q-learning是通过奖励与惩罚机制建立的Q_table去判断其下一步该怎么走
一个小笨蛋如何自己学着用最近的步伐走到最右边
产生一组伪随机数列,伪随机是随机种子是相同的 np.random.seed(2)#这里随机种子为2
这里可以理解为超参数?~,用来描述这个环境的各种参数吧
N_STATUS = 6 #有多少种状态 ACTIONS =['left','right'] #行为数量,仅为左右移动 EPSILON = 0.9
#greedy polite 百分90选择最优,类似模拟退火给其一定不选最优的概率的思想,百分之10选择随机的动作 ALPHA = 0.1 #学习效率
LAMBDA =0.9 #对未来奖励的一个衰减度 MAX_EPISODES = 25 #最大运行次数,回合数 FRESH_TIME = 0.1
#走一步花费的时间,这里仅仅是运行的时候跑的速度
初始化建立Q_table
def build_q_table(n_states, actions): #np.zeros为初始化为0的矩阵
#然后告诉建立一个表格,塞进去内容和每个列的下标 table =
pd.DataFrame(np.zeros((n_states,len(actions))),columns=actions,)#运用pandas建立表格
print(table)return table
这里是判断下一步的行为
def choose_action(state,q_table): #根据目前的状态选择一个合适的动作 state_actions =
q_table.iloc[state,:]#在state位置上,拿出全部内容 if(np.random.uniform() > EPSILON) or
(state_actions.all()==0): #随机出来的数字大于0.9或者后面那个or是考虑全部为0的时候,随机选一个方向去走,也就是刚开始的时候
action_name = np.random.choice(ACTIONS)#如果随机概率毕竟大,那么随机选 else: action_name =
state_actions.argmax()#在state_actions中的最大值取出来,这里只有2个行为,因为上面只拿出来了一行的行为 return
action_name
这里根据现在的行为与将要做的行为,设定奖励R(打分
def get_env_feedback(S,A): if A == 'right': if(S == N_STATUS - 2): #到达目的地 S =
'End' R = 1 else: S = S + 1 R = 0 else: R = 0 if(S == 0):#在最左边那么就原地不动 S= 0 else
: S = S -1 return S,R
为了让结果更直观,这里设定一个环境,每次都用’0’表现出目前所在的位置
def update_env(S, episode, step_counter): env_list = ['-']*(N_STATUS-1)+['T']
#创造出一个样子 if S == 'End': print('it is %d times\r',step_counter) time.sleep(2) #
暂停程序2秒钟 else: env_list[S]='0' #现在所在的位置是0 interaction = ''.join(env_list)
#join()为拼接字符串 print('\r{}'.format(interaction),end='') #输出运动过程
time.sleep(FRESH_TIME) table = build_q_table(N_STATUS,ACTIONS)#建立table
主要代码
def rl(): q_table = build_q_table(N_STATUS,ACTIONS) #创建这个q表格 for episode in
range(MAX_EPISODES):#episode从0开始的步数, step_counter = 0 S = 0 is_End = False
update_env(S,episode,step_counter)while not is_End: #当不是终点的时候 A =
choose_action(S,q_table) S_,R = get_env_feedback(S,A)#判断下一步所在位置与R奖励 q_predict =
q_table.ix[S,A]#混合索引,找到S行的A位置的分数,作为现在的 if S_ != 'End': q_target = R +
LAMBDA*q_table.iloc[S_,:].max()#目前的奖励+以后的奖励可能 else: q_target = R #下一步是目标 is_End
=True #那么是终止 q_table.ix[S, A] += ALPHA * (q_target - q_predict) #新的Q的值 S = S_
#移动到下一步 update_env(S, episode, step_counter+1) step_counter +=1 return q_table
#训练结束的时候输出图标的结果 if __name__ == '__main__': q_table = rl() print(q_table)

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信