强化学习(Q-learning~了解了一波

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

你可能感兴趣的:(机器学习)