Q Learning的实例

本文详细介绍了Q学习算法的实施步骤,包括初始化Q表,选择action的策略,环境反馈机制以及Q表更新。通过实例演示了如何在不同状态下执行动作,以及如何利用ε-greedy策略进行决策。重点讲解了环境状态更新和奖励机制,展示了强化学习的基本运作过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.第一步初始化Q表。

2.第二步初始化s

3.第三步重复的,选择一个action从s中用policy函数,policy函数源自于Q算法。

4.第四步选择一个action,观察reward和新的s。

5.然后更新Q表。

6.更新s,s就是一个环境,每次做过action都不一样。

7.知道s是terminal状态。

1.首先创建Q_table,也就是每个动作的得分。参数是两个,第一个是有多少个状态,第二个是actions。

效果如图:

 

choose action的函数的功能:

 

2.选择action: 

(1)state_actions = q_table.iloc[state, :]
state_actions是state如今所处的状态的动作选择,如图所示,在本例中就是有两个可以选择的动作。

(2)if (np.random.uniform() > EPSILON) or ((state_actions == 0).all()):  # act non-greedy or state-action have no value
    action_name = np.random.choice(ACTIONS)

这句的意思是说在初始的状态下和有百分之十的概率可以进行随机选择,会随机选择action进行行动。

(3)else:   # act greedy
    action_name = state_actions.idxmax()

这句的意思是说否则的话就选择那个索引的值最大的那个。

对于第二部分出现的语法的解释,

(1)会生成一个随机数

 (2)iloc会将这个行的两个列的数值和对应的值。

 (3)table.iloc[1,:] == 0,会将等于0的值进行显示出来。

 (4)(table.iloc[1,:] == 0).all(),如果里面的值全都等于0会显示true。

 (5)这一步随随机选一个ACTIONS,这个ACTIONS是一个列表的数据类型。

 在使用的过程中学到,loc好像比iloc更实用。loc里面是字符串或者索引的值都行,但是iloc只能是索引的值。

 (6)这一步会根据索引将最大的值显示出来

(3)获得环境的反馈 

其中A是action,N_STATES等于6,也就是说一共有6个状态如果S的状态等于4的话,而且A等于right的话,那么说明在状态S下还会继续往右走,这就说明S_(也就是S的下一个状态)是terminal。

 否则的话,R=0(这里没有R等于-1这个选择,也就是说只用一个R来标识往哪走?R=0就往左走,R等于1就往右走?)

 (4)进行环境的更新:这一步会进行环境的更新,也就是显示的页面。

这一步会显示一个环境的值,也就是5个-和一个T。

可以对list进行join操作, 前面的字符串就是连接的时候填充的一个字符。如果是"",没有东西的话那么就是对原来的list进行连接。

 (5)最后进入到了RL,也就是强化学习的整个总览的函数这里。

(1)第一步会生成一个初始化的q_table的dataframe,里面的值一开始都是0。 

(2)进行随机选择,第一步选择的是往右走,A=right。这里S_等于1,R等于0, 这个R并不是往右走而是reward,只有到底的时候才会有R=1的回馈。

(3)这里的意思是,reward会随着离目标的距离而变少,也就是说最先更新的reward是[4,right]的reward,然后在更新的才是下面的reward。 

 

### Q-Learning 示例代码 为了展示 Q-Learning 如何工作,下面提供了一个简单的迷宫环境中的 Q-Learning 实现。此环境中,智能体试图找到从起点到达终点的最佳路径。 ```python import numpy as np import random class MazeEnv: def __init__(self, size=5): self.size = size self.state = (0, 0) self.goal_state = (size-1, size-1) def reset(self): self.state = (0, 0) return self.state def step(self, action): row, col = self.state if action == 'up' and row > 0: row -= 1 elif action == 'down' and row < self.size - 1: row += 1 elif action == 'left' and col > 0: col -= 1 elif action == 'right' and col < self.size - 1: col += 1 new_state = (row, col) reward = -1 done = False if new_state == self.goal_state: reward = 10 done = True self.state = new_state return new_state, reward, done def q_learning(env, episodes=1000, alpha=0.8, gamma=0.95, epsilon=0.1): actions = ['up', 'down', 'left', 'right'] q_table = {} for episode in range(episodes): state = env.reset() while True: if state not in q_table: q_table[state] = {action: 0 for action in actions} if random.uniform(0, 1) < epsilon: action = random.choice(actions) else: action = max(q_table[state], key=q_table[state].get) next_state, reward, done = env.step(action) if next_state not in q_table: q_table[next_state] = {action: 0 for action in actions} best_next_action = max(q_table[next_state], key=q_table[next_state].get) td_target = reward + gamma * q_table[next_state][best_next_action] td_error = td_target - q_table[state][action] q_table[state][action] += alpha * td_error state = next_state if done: break return q_table env = MazeEnv(size=4) q_table = q_learning(env) print("Q-table after training:") for state, values in sorted(q_table.items()): print(f"{state}: {values}") ``` 上述代码展示了如何在一个小型网格世界中应用 Q-learning 来训练一个能够导航至目标位置的智能体[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值