【强化学习算法: Q学习】示例源码,适合于理解算法的基本原理和工作方式

2023-12-13 09:17:49

智能体(agent)能够在环境中通过试错来学习如何达成目标。智能体根据其观察到的环境状态,选择行动,然后接收环境给出的奖励或惩罚,自适应操作,获取更高的得分。智能体的目标是最大化其长期获得的总奖励。

import numpy as np
import random

# 定义一个简单的环境:网格世界
class GridWorld:
    def __init__(self, width, height, start, goal):
        self.width = width
        self.height = height
        self.start = start
        self.goal = goal
        self.state = start

    def reset(self):
        self.state = self.start
        return self.state

    def step(self, action):
        x, y = self.state
        if action == 0:   # 上
            y = max(y - 1, 0)
        elif action == 1: # 右
            x = min(x + 1, self.width - 1)
        elif action == 2: # 下
            y = min(y + 1, self.height - 1)
        elif action == 3: # 左
            x = max(x - 1, 0)

        self.state = (x, y)
        reward = 1 if self.state == self.goal else 0
        done = self.state == self.goal
        return self.state, reward, done

# 创建环境
env = GridWorld(5, 5, (0, 0), (4, 4))
n_states = env.width * env.height
n_actions = 4

# 初始化Q表
Q = np.zeros((n_states, n_actions))

# 学习参数
learning_rate = 0.1
discount_factor = 0.99
epsilon = 0.1
n_episodes = 1000

# 将网格位置转换为状态编号
def to_state(x, y):
    return y * env.width + x

# Q学习过程
for episode in range(n_episodes):
    state = env.reset()
    done = False

    while not done:
        current_state = to_state(*state)

        # ε-贪婪策略进行动作选择
        if random.uniform(0, 1) < epsilon:
            action = random.choice(range(n_actions))
        else:
            action = np.argmax(Q[current_state])

        # 执行动作
        next_state, reward, done = env.step(action)
        next_state = to_state(*next_state)

        # 更新Q值
        best_next_action = np.argmax(Q[next_state])
        td_target = reward + discount_factor * Q[next_state, best_next_action]
        td_error = td_target - Q[current_state, action]
        Q[current_state, action] += learning_rate * td_error

# 输出学习到的Q表
print("学到的Q表:")
print(Q.reshape(env.width, env.height, n_actions))

这段代码实现了Q学习算法在一个简单的网格世界环境中的应用。以下是代码的主要部分和它们的功能:

环境设置 - GridWorld

  • GridWorld 类定义了一个简单的网格世界环境。
  • step 函数模拟了在环境中采取行动的后果,包括状态的转移、奖励的获得和是否达到目标状态。

初始化参数和Q表

  • 定义了环境的大小、状态数、动作数。
  • 初始化了一个Q表,用于存储每个状态-动作对的值。

Q学习过程

  • 对于每个回合,首先重置环境到初始状态。
  • 在每个状态下,使用 ε-贪婪策略选择动作。这意味着有一个小概率随机选择动作(探索),否则选择具有最高Q值的动作(利用)。
  • 执行选择的动作,并观察结果,包括下一个状态和奖励。
  • 更新Q表。这个更新是基于所获得的奖励和对下一个状态的最佳动作的估计。
  • 重复这个过程直到达到目标状态或回合结束。

结果输出

  • 最后,输出学习到的Q表。

这个实现是一个基本的Q学习示例,适合于理解算法的基本原理和工作方式。在复杂的实际应用中,可能需要更高级的技术和优化。

文章来源:https://blog.csdn.net/chenhao0568/article/details/134923048
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。