强化学习Q-learning知识点理解
-
贪心:有 的概率选择最优行为, 的概率随机选择行为,0< <1
Q-learning实质:学习当state确定后,采取特定的action所得到的操作奖励,(reward表示状态转换的结果奖励)
Q函数由s、a两个参数组成,假设存在n种state,m种action,考虑一个 的矩阵,对应着 个二元对的Q值
与此同时,存在另一个的矩阵,对应着n种state,m种action组合的reward,这些reward在最早给定
Q-table(矩阵)的更新策略如下:操作奖励更新为当前奖励与未来奖励的奖励的加权和,状态同步转移
可以看出,时Q值更加注重于未来奖励,反之注重于当前奖励(不更新)
局限性:若状态空间过大,
代码示例如下:# -*- coding:utf-8 -*- #|-----|-----|-----| #| | | | #| 0 | 1 | 2 | #|_____|_____|_____| #| | | | #| 3 | 4 | 5 | #|_____|_____|_____| # Entering room 0 can get 10 reward, else get -1 reward import argparse import random parser = argparse.ArgumentParser() parser.add_argument('-g', type=float, default=0.8, dest='gamma') parser.add_argument('-s', type=int, default=1000, dest='step_num') parser.add_argument('-e', type=float, default=1.0, dest='epsilon') args = parser.parse_args() reward = [[0, -1, 0, -1, 0, 0], [10, 0, -1, 0, -1, 0], [0, -1, 0, 0, 0, -1], [10, 0, 0, 0, -1, 0], [0, -1, 0, -1, 0, -1], [0, 0, -1, 0, -1, 0]] q_table = [[0 for x in range(6)] for y in range(6)] step = 0 while step < args.step_num: s = random.randint(1, 5) while s != 0: if random.random() < args.epsilon: action_list = [x for x in range(6) if reward[s][x] != 0] s2 = random.choice(action_list) else: s2 = q_table[s].index(max(q_table[s])) q_table[s][s2] = reward[s][s2] + args.gamma * max([q_table[s2][y] for y in range(6) if y != s2]) s = s2 step += 1 print(q_table) # 0, 0, 0, 0, 0, 0 # 10, 0, 4.6 0 4.6 0 # 0, 7, 0, 0, 0, 2.68 # 10, 0, 0, 0, 4.6 0 # 0, 7, 0, 7, 0, 2.68 # 0, 0, 4.6, 0, 4.6, 0
-
技术含量太低,差评
-
内容不够,代码来凑
-
@haizi 臣附议