python编程实现Q-learning算法
时间: 2023-09-15 14:15:20 浏览: 192
python q-learning
4星 · 用户满意度95%
Q-learning是一种基于值函数的强化学习算法,它可以用来处理离散状态和动作空间的问题。在下面的代码中,我们将使用Q-learning来解决一个简单的迷宫问题。
首先,我们需要定义迷宫的状态空间、动作空间和奖励函数。我们将使用一个3x3的迷宫,其中0表示空格,1表示障碍物,2表示目标。
```python
import numpy as np
# 定义迷宫状态空间
states = [0, 1, 2, 3, 4, 5, 6, 7, 8]
# 定义动作空间
actions = [0, 1, 2, 3] # 上下左右
# 定义奖励函数
rewards = np.array([
[-1, -1, -1],
[-1, 0, -1],
[-1, -1, 1]
])
```
接下来,我们需要初始化Q函数。我们将使用一个3x3x4的数组来表示Q函数,其中第一个维度表示状态,第二个维度表示动作,第三个维度表示Q值。
```python
# 初始化Q函数
q = np.zeros((len(states), len(actions)))
# 定义学习率和折扣因子
alpha = 0.5
gamma = 0.9
```
现在我们可以开始训练Q函数了。训练过程将在迭代中进行,每个迭代都需要从起始状态开始执行动作,直到达到目标状态。在每个迭代中,我们将更新Q函数的值,以便更好地指导智能体的决策。
```python
# 迭代1000次
for i in range(1000):
# 选择起始状态
state = 0
# 当前状态不为目标状态时执行动作
while state != 8:
# 选择动作
if np.random.uniform() < 0.1:
action = np.random.choice(actions)
else:
action = np.argmax(q[state])
# 执行动作并观察下一个状态和奖励
next_state = state + [-3, 3, -1, 1][action]
reward = rewards[next_state // 3, next_state % 3]
# 更新Q函数
q[state][action] = q[state][action] + alpha * (reward + gamma * np.max(q[next_state]) - q[state][action])
# 转移到下一个状态
state = next_state
```
训练完成后,我们可以使用Q函数来指导智能体的决策。在下面的代码中,我们将从起始状态开始执行动作,直到达到目标状态。
```python
# 从起始状态开始执行动作
state = 0
while state != 8:
action = np.argmax(q[state])
next_state = state + [-3, 3, -1, 1][action]
state = next_state
print("Reached the goal!")
```
完整的代码如下:
```python
import numpy as np
# 定义迷宫状态空间
states = [0, 1, 2, 3, 4, 5, 6, 7, 8]
# 定义动作空间
actions = [0, 1, 2, 3] # 上下左右
# 定义奖励函数
rewards = np.array([
[-1, -1, -1],
[-1, 0, -1],
[-1, -1, 1]
])
# 初始化Q函数
q = np.zeros((len(states), len(actions)))
# 定义学习率和折扣因子
alpha = 0.5
gamma = 0.9
# 迭代1000次
for i in range(1000):
# 选择起始状态
state = 0
# 当前状态不为目标状态时执行动作
while state != 8:
# 选择动作
if np.random.uniform() < 0.1:
action = np.random.choice(actions)
else:
action = np.argmax(q[state])
# 执行动作并观察下一个状态和奖励
next_state = state + [-3, 3, -1, 1][action]
reward = rewards[next_state // 3, next_state % 3]
# 更新Q函数
q[state][action] = q[state][action] + alpha * (reward + gamma * np.max(q[next_state]) - q[state][action])
# 转移到下一个状态
state = next_state
# 从起始状态开始执行动作
state = 0
while state != 8:
action = np.argmax(q[state])
next_state = state + [-3, 3, -1, 1][action]
state = next_state
print("Reached the goal!")
```
阅读全文