强化学习的Sarsa与Q-Learning的Cliff-Walking对比实验
Cliff-Walking问题的描述
悬崖行走:从S走到G,其中灰色部分是悬崖不可到达,求可行方案
建模中,掉下悬崖的奖励是-100,G的奖励是10,原地不动的奖励-1,到达非终点位置的奖励是0(与图中的示意图不一致,不过大差不差),分别使用同轨策略的Sarsa与离轨策略的Q-learning算法,经过20000幕进化迭代得出safe path,optimal path,最后根据Q值来得出最终的策略,以此来对上图进行复现
Sarsa和Q-Learning算法对比
Sarsa算法
Q-Learning算法
首先要介绍的是什么是ε-greedy,即ε-贪心算法,一般取定ε为一个较小的0-1之间的值(比如0.2)
在算法进行的时候,用计算机产生一个伪随机数,当随机数小于ε时采取任意等概率选择的原则,大于ε时则取最优的动作。
在介绍完两个算法和ε-贪心算法之后,一言概之就是,Sarsa对于当前状态s的a的选择是ε-贪心的,对于s’的a‘的选择也是ε-贪心的Q-Learning与sarsa一样,只是对于s’的a‘的选择是直接取最大的。
代码分享
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches # 图形类
np.random.seed(2022)
class Agent():
terminal_state = np.arange(36, 48) # 终止状态
def __init__(self, board_rows, board_cols, actions_num, epsilon=0.2, gamma=0.9, alpha=0.1):
self.board_rows = board_rows
self.board_cols = board_cols
self.states_num = board_rows * board_cols
self.actions_num = actions_num
self.epsilon = epsilon
self.gamma = gamma
self.alpha = alpha
self.board = self.create_board()
self.rewards = self.create_rewards()
self.qtable = self.create_qtable()
def create_board(self): # 创建面板
board = np.zeros((self.board_rows, self.board_cols))
board[3][11] = 1
board[3][1:11] = -1
return board
def create_rewards(self): # 创建奖励表
rewards = np.zeros((self.board_rows, self.board_cols))
rewards[3][11] = 10
rewards[3][1:11] = -100
return rewards
def create_qtable(self): # 创建Q值
qtable = np.zeros((self.states_num, self.actions_num))
return qtable
def change_axis_to_state(self