跟着莫烦python 从零开始强化学习之Q-Learning 一维探索者 代码完整注释版
生活随笔
收集整理的這篇文章主要介紹了
跟着莫烦python 从零开始强化学习之Q-Learning 一维探索者 代码完整注释版
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.本文實(shí)現(xiàn)的是一個一維探索者尋找寶藏的小游戲
莫煩python 大佬講解Q-Learning以及實(shí)現(xiàn)的視頻鏈接
視頻:
【莫煩Python】強(qiáng)化學(xué)習(xí) Reinforcement Learning_嗶哩嗶哩_bilibili
代碼:
GitHub - MorvanZhou/Reinforcement-learning-with-tensorflow: Simple Reinforcement learning tutorials, 莫煩Python 中文AI教學(xué)
2.示例效果:
show_result
3.Q-Learning代碼學(xué)習(xí)(修改了pandas已棄用的函數(shù),增加了詳細(xì)注釋)
########################################################### #######Q-Learning 是一種離線學(xué)習(xí)的Model-Free 方法############## # 這種使用貪心算法進(jìn)行隨機(jī)探索更新的方法只適用于有限離散狀態(tài)和動作空間 # ###########################################################import numpy as np import pandas as pd import time# 設(shè)置隨機(jī)數(shù)種子 # 用于生成偽隨機(jī)數(shù) # 放在這里保證每一次運(yùn)行程序隨機(jī)過程相同,生成的隨機(jī)數(shù)和UP主示例結(jié)果相同 # 可以不用設(shè)置 # np.random.seed(n) # https://zhuanlan.zhihu.com/p/266472620 np.random.seed(3)# 狀態(tài)數(shù),一維狀態(tài)空間的長度 N_STATES = 6# 動作空間 ACTIONS = ['left', 'right']# 貪心算法參數(shù)(隨機(jī)生成) EPSILON = 0.9# 學(xué)習(xí)率 ALPHA = 0.1# 衰減因子 GAMMA = 0.9# 訓(xùn)練總輪數(shù) MAX_EPISODES = 10# 每次環(huán)境更新用時 FRESH_TIME = 0.2##########建立Q-Table函數(shù)#################### ##########參數(shù) 狀態(tài)數(shù),動作################# def build_q_table(n_states, actions):# 生成DataFrame數(shù)據(jù)類型,保存Q值# pd.DataFrame()# DataFrame是Python中Pandas庫中的一種數(shù)據(jù)結(jié)構(gòu),它類似excel,是一種二維表。# https://www.cnblogs.com/andrew-address/p/13040035.htmltable = pd.DataFrame(# 初始化 行數(shù)為n_states,列數(shù)為動作數(shù)len(actions)的DataFrame,數(shù)據(jù)為全零np.zeros((n_states, len(actions))),# 列名為動作名columns=actions,)# 顯示# "{}".format()方法# https://www.itzixishi.com/course/python/att-string-format.htmlprint('Q-Table')print('\n{}'.format(table))return table# Q-Table 初始化示例 # q_table=build_q_table(N_STATES,ACTIONS) # left right # 0 0.0 0.0 # 1 0.0 0.0 # 2 0.0 0.0 # 3 0.0 0.0 # 4 0.0 0.0 # 5 0.0 0.0###########動作選擇函數(shù)################## ###########輸入?yún)?shù):當(dāng)前狀態(tài)和q_table#### def choose_action(state, q_table):# 從q_table 獲取當(dāng)前狀態(tài)可以選擇的動作的Q值# DataFrame.iloc()# https://blog.csdn.net/bluishglc/article/details/121791352state_actions = q_table.iloc[state, :]########貪心算法實(shí)現(xiàn)############## 從0-1的均勻分布中生成隨機(jī)數(shù)# np.random.uniform()# https://blog.csdn.net/u013920434/article/details/52507173random_num = np.random.uniform()# print('random_number{}'.format(random_num))# 如果隨機(jī)數(shù)大于EPSILON 0.9,或者狀態(tài)對應(yīng)動作的Q值全為0時,隨機(jī)選擇動作if (random_num > EPSILON) or (state_actions.all() == 0):# 隨機(jī)選擇動作的實(shí)現(xiàn)方法# np.random.choice()# https://blog.csdn.net/weixin_42462804/article/details/106122642action_name = np.random.choice(ACTIONS)else:# 選擇Q值最大的動作的索引,即'left'或者'right'# pandas.DataFrame.idxmax()action_name = state_actions.idxmax()# 返回當(dāng)前狀態(tài)下選擇的動作名return action_name###########環(huán)境反饋函數(shù)################################# ###########需要參數(shù):當(dāng)前狀態(tài)和根據(jù)Q-Table選擇的動作######## def get_env_feedback(S, A):if A == 'right':# 狀態(tài)4即環(huán)境為 ---o-T 時,如果選擇動作為 'right',則狀態(tài)變?yōu)?'terminal'if S == N_STATES - 2:S_ = 'terminal'# 給定獎勵 1R = 1else:# 狀態(tài)+1,獎勵0S_ = S + 1R = 0else:# 向左走,獎勵為0R = 0# 初始狀態(tài)向左走,保持初始狀態(tài)if S == 0:S_ = S# 非初始狀態(tài)向左走,狀態(tài)-1else:S_ = S - 1# 返回下一個狀態(tài)和獎勵值return S_, R##############環(huán)境更新函數(shù)##################################################### ##############需要參數(shù): 當(dāng)前狀態(tài)S,輪數(shù)episode以及每一輪進(jìn)行到的步數(shù)step_counter##### def update_env(S, episode, step_counter):# 環(huán)境列表env_list = ['-'] * (N_STATES - 1) + ['T']# ['-', '-', '-', '-', '-', 'T']if S == 'terminal':# 'terminal'狀態(tài)下輸出訓(xùn)練episode和total_stepinteraction = 'Episode %s: total _steps = %s ' % (episode + 1, step_counter)print('\r{}'.format(interaction), end='')# 延時顯示,方便演示time.sleep(2)print('\r ', end='')else:# 狀態(tài)S時,設(shè)置env_list[S] = 'o'env_list[S] = 'o'# 連接env_list為新的字符串,方便顯示# ''.join()# https://blog.csdn.net/weixin_43969815/article/details/97142426interaction = ''.join(env_list)print('\r{}'.format(interaction), end='')# 延時更新環(huán)境time.sleep(FRESH_TIME)#############強(qiáng)化學(xué)習(xí)算法實(shí)現(xiàn)函數(shù)################# def rl():# 初始化Q-Tableq_table = build_q_table(N_STATES, ACTIONS)# 開始訓(xùn)練for episode in range(MAX_EPISODES):# 初始化step計(jì)數(shù)器為0step_counter = 0# 初始化狀態(tài)為0S = 0# 初始化每一輪的結(jié)束標(biāo)志符為Falseis_terminated = False# 更新環(huán)境update_env(S, episode, step_counter)while not is_terminated:# 根據(jù)當(dāng)前狀態(tài)和Q-Table選擇動作A = choose_action(S, q_table)# 給出根據(jù)當(dāng)前狀態(tài)和Q-Table選擇動作后的新狀態(tài)和返回值S_, R = get_env_feedback(S, A)# 根據(jù)Q-Table得到q_predq_predict = q_table.loc[S, A]# 獲取q_targetif S_ != 'terminal':q_target = R + GAMMA * q_table.iloc[S_, :].max()else:q_target = Ris_terminated = Trueq_table.loc[S, A] += ALPHA * (q_target - q_predict)# 更新狀態(tài)S = S_# 跟新環(huán)境update_env(S, episode, step_counter + 1)# step 計(jì)數(shù)器+1step_counter += 1return q_tableif __name__ == "__main__":q_table = rl()print('\r\nQ-table:\n', q_table)總結(jié)
以上是生活随笔為你收集整理的跟着莫烦python 从零开始强化学习之Q-Learning 一维探索者 代码完整注释版的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript之嵌套函数
- 下一篇: 莫烦python博客_莫烦Python