IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> python——实现简单的强化学习 -> 正文阅读

[人工智能]python——实现简单的强化学习

强化学习

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。

强化学习是智能体(Agent)以“试错”的方式进行学习,通过与环境进行交互获得的奖赏指导行为,目标是使智能体获得最大的奖赏,强化学习不同于连接主义学习中的监督学习,主要表现在强化信号上,强化学习中由环境提供的强化信号是对产生动作的好坏作一种评价(通常为标量信号),而不是告诉强化学习系统RLS(reinforcement learning system)如何去产生正确的动作。由于外部环境提供的信息很少,RLS必须靠自身的经历进行学习。通过这种方式,RLS在行动-评价的环境中获得知识,改进行动方案以适应环境。

Q-Learning算法

伪代码

在这里插入图片描述

Q value的更新是根据贝尔曼方程

Q(st,at)←Q(st,at)+α[rt+1+λmaxaQ(st+1,a)?Q(st,at)]

代码实现

算法参数
epsilon = 0.9  # 贪婪度
alpha = 0.1  # 学习率
gamma = 0.8  # 奖励递减值
状态集
states = range(6)  # 状态集
def get_next_state(state, action):
    '''对状态执行动作后,得到下一状态'''
    global states

    # l,r,n = -1,+1,0
    if action == 'right' and state != states[-1]:  # 除非最后一个状态(位置),向右就+1
        next_state = state + 1
    elif action == 'left' and state != states[0]:  # 除非最前一个状态(位置),向左就-1
        next_state = state - 1
    else:
        next_state = state
    return next_state
动作集
actions = ['left', 'right']  # 动作集
def get_valid_actions(state):
    '''取当前状态下的合法动作集合,与reward无关!'''
    global actions  # ['left', 'right']

    valid_actions = set(actions)
    if state == states[-1]:  # 最后一个状态(位置),则
        valid_actions -= set(['right'])  # 不能向右
    if state == states[0]:  # 最前一个状态(位置),则
        valid_actions -= set(['left'])  # 不能向左
    return list(valid_actions)
奖励集
rewards = [0, 0, 0, 0, 0, 1]  # 奖励集
Q table

Q table是一种记录状态-行为值 (Q value) 的表。常见的q-table都是二维的,但是也有3维的Q table。

q_table = pd.DataFrame(data=[[0 for _ in actions] for _ in states], index=states, columns=actions)
Q-learning算法实现
for i in range(13):
    # current_state = random.choice(states)
    current_state = 0

    update_env(current_state)  # 环境相关
    total_steps = 0  # 环境相关

    while current_state != states[-1]:
        if (random.uniform(0, 1) > epsilon) or ((q_table.loc[current_state] == 0).all()):  # 探索
            current_action = random.choice(get_valid_actions(current_state))
        else:
            current_action = q_table.loc[current_state].idxmax()  # 利用(贪婪)

        next_state = get_next_state(current_state, current_action)
        next_state_q_values = q_table.loc[next_state, get_valid_actions(next_state)]
        q_table.loc[current_state, current_action] += alpha * (
                    rewards[next_state] + gamma * next_state_q_values.max() - q_table.loc[current_state, current_action])
        current_state = next_state

        update_env(current_state)  # 环境相关
        total_steps += 1  # 环境相关

    print('\rEpisode {}: total_steps = {}'.format(i, total_steps), end='')  # 环境相关
    time.sleep(2)  # 环境相关
    print('\r                                ', end='')  # 环境相关

print('\nq_table:')
print(q_table)
更新状态
def update_env(state):
    global states

    env = list('-----T')
    if state != states[-1]:
        env[state] = '0'
    print('\r{}'.format(''.join(env)), end='')
    time.sleep(0.1)

完整代码

import pandas as pd
import random
import time

#########参数
epsilon = 0.9  # 贪婪度
alpha = 0.1  # 学习率
gamma = 0.8  # 奖励递减值

#####探索者的状态,即可到达的位置
states = range(6)  # 状态集
actions = ['left', 'right']  # 动作集
rewards = [0, 0, 0, 0, 0, 1]  # 奖励集

q_table = pd.DataFrame(data=[[0 for _ in actions] for _ in states], index=states, columns=actions)


def update_env(state):
    global states

    env = list('-----T')
    if state != states[-1]:
        env[state] = '0'
    print('\r{}'.format(''.join(env)), end='')
    time.sleep(0.1)


def get_next_state(state, action):
    '''对状态执行动作后,得到下一状态'''
    global states

    # l,r,n = -1,+1,0
    if action == 'right' and state != states[-1]:  # 除非最后一个状态(位置),向右就+1
        next_state = state + 1
    elif action == 'left' and state != states[0]:  # 除非最前一个状态(位置),向左就-1
        next_state = state - 1
    else:
        next_state = state
    return next_state


def get_valid_actions(state):
    '''取当前状态下的合法动作集合,与reward无关!'''
    global actions  # ['left', 'right']

    valid_actions = set(actions)
    if state == states[-1]:  # 最后一个状态(位置),则
        valid_actions -= set(['right'])  # 不能向右
    if state == states[0]:  # 最前一个状态(位置),则
        valid_actions -= set(['left'])  # 不能向左
    return list(valid_actions)


for i in range(13):
    # current_state = random.choice(states)
    current_state = 0

    update_env(current_state)  # 环境相关
    total_steps = 0  # 环境相关

    while current_state != states[-1]:
        if (random.uniform(0, 1) > epsilon) or ((q_table.loc[current_state] == 0).all()):  # 探索
            current_action = random.choice(get_valid_actions(current_state))
        else:
            current_action = q_table.loc[current_state].idxmax()  # 利用(贪婪)

        next_state = get_next_state(current_state, current_action)
        next_state_q_values = q_table.loc[next_state, get_valid_actions(next_state)]
        q_table.loc[current_state, current_action] += alpha * (
                    rewards[next_state] + gamma * next_state_q_values.max() - q_table.loc[current_state, current_action])
        current_state = next_state

        update_env(current_state)  # 环境相关
        total_steps += 1  # 环境相关

    print('\rEpisode {}: total_steps = {}'.format(i, total_steps), end='')  # 环境相关
    time.sleep(2)  # 环境相关
    print('\r                                ', end='')  # 环境相关

print('\nq_table:')
print(q_table)

欢迎留言指出错误

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-12-11 15:43:22  更:2021-12-11 15:43:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 0:16:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码