智能体(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学习示例,适合于理解算法的基本原理和工作方式。在复杂的实际应用中,可能需要更高级的技术和优化。