唔~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)