q-learn

 

import numpy as np
a = np.zeros(16)
a[6]=-1
a[9]=-1
a[10]=1
a = np.reshape (a,(4,4))
print(a)

mapp = a
qtable = np.zeros((16,4))# up ,down, left ,right score
rate = 0.4#learning rate
y = 0.4
row = 0
col =0

loop = 1000

while True:
  loop =loop -1;
  if(loop<0):
    break
  for row in range(4):
    for col in range(4):
      qind = row*4+col
      #up
      rowt = row -1
      if(rowt<0 or mapp[rowt,col] ==-1):
        qtable[qind,0]= qtable[qind,0] +(-1*rate)
      else:
        qtable[qind,0]= qtable[qind,0] +\
        (mapp[rowt,col]+y*max(qtable[rowt*4+col,:]- qtable[qind,0]))*rate


      #down
      rowt = row +1
      if(rowt>3 or mapp[rowt,col] ==-1):
        qtable[qind,1]= qtable[qind,1] +(-1*rate)
      else:
        qtable[qind,1]= qtable[qind,1] +\
        (mapp[rowt,col]+y*max(qtable[rowt*4+col,:]- qtable[qind,1]))*rate



      #left
      colt = col -1
      if(colt<0  or mapp[row,colt] ==-1):
        qtable[qind,2]= qtable[qind,2] +(-1*rate)
      else:
        qtable[qind,2]= qtable[qind,2] +\
        (mapp[row,colt]+y*max(qtable[row*4+colt,:]- qtable[qind,2]))*rate

        #(mapp[row,colt])*rate  


      #down
      colt = col +1
      if(colt>3 or mapp[row,colt] ==-1):
        qtable[qind,3]= qtable[qind,3] +(-1*rate)  
      else:
        qtable[qind,3]= qtable[qind,3] +\
        (mapp[row,colt]+y*max(qtable[row*4+colt,:]- qtable[qind,3]))*rate
        #(mapp[row,colt])*rate  

print(qtable)

a@ubuntu:~$ python3 qLearn.py 
[[ 0.  0.  0.  0.]
 [ 0.  0. -1.  0.]
 [ 0. -1.  1.  0.]
 [ 0.  0.  0.  0.]]
[[-400.          211.21810019 -400.          211.21810019]
 [-400.          210.07679584  210.07679584  212.57679584]
 [-400.         -400.          211.43549149  213.93549149]
 [-400.          215.29418715  212.79418715 -400.        ]
 [ 210.07679584  212.57679584 -400.          210.07679584]
 [ 211.43549149 -400.          211.43549149 -400.        ]
 [ 212.79418715  217.79418715  210.29418715  215.29418715]
 [ 214.1528828   216.6528828  -400.         -400.        ]
 [ 211.43549149  213.93549149 -400.         -400.        ]
 [ 210.29418715  215.29418715  212.79418715  217.79418715]
 [-400.          216.6528828  -400.          216.6528828 ]
 [ 215.51157845  215.51157845  218.01157845 -400.        ]
 [ 212.79418715 -400.         -400.          215.29418715]
 [-400.         -400.          214.1528828   216.6528828 ]
 [ 218.01157845 -400.          215.51157845  215.51157845]
 [ 216.8702741  -400.          216.8702741  -400.        ]]
 

https://www.jianshu.com/p/1db893f2c8e4

继续接着上一篇,这篇文章介绍强化学习中的一个经典算法——Q Learning.

之前的文章中已经介绍过了,强化学习就是让机器人(Agent)在与环境的互动过程学习解决问题的最佳路径的过程。

强化学习通常包括这么几个重要概念:

  • 状态(State (S))
  • 动作(Action(A))
  • 奖励(Reward(R))

下面以一个例子来解释这几个概念,并介绍一下Q Learning是什么:


上图红色方框就是我们的机器人,任务是要在4x4的迷宫中找到黄色圆圈的宝藏,并学习到达宝藏的最佳路径。如果以左上角的初始状态为S0,那么整个迷宫一共有16个状态(State)(从左到右从上到下分别是S0到S15)。机器人的行动(Action)有四个: 分别是向左(A1)向右(A2)向上(A3)和向下(A4)移动。如果找到黄色圆圈(宝藏)奖励(Reward)为1,掉入黑色陷阱奖励(Reward)为-1,其他地方为0。

 

1. Q表(Q table)

Q Learning 就是创造一个Q表,来指导机器人的行动,Q表对应Action的数值越大,机器人就越大概率地采取这个Action.

Q table (States\Actions)left (A1)right (A2)up (A3)down (A4)
S0-13-12
S112-11
..............

比如Q表在S0最大概率会向右移动,在S1最大概率还是向右移动,因为A2在两个状态的Q表数值都是最大的。

这个Q表是经过学习之后的结果,学习并不断更新这个表的过程就是Q Learning。

2. 探索-利用困境(Explore-Exploit dilemma)

Q Learning 是如何学习并更新Q表呢?正如多臂老虎机(Multi-armed bandit)问题一样,如果机器人仅仅按照表中最大概率指导行动的话,是学不到任何东西的,它还需要不停地在未知地图上进行探索,这就是是探索-利用困境(Explore-Exploit dilemma)。同样的,我们也可以用ε贪婪方法(ε -Greedy method)的方法来解决这个困境。

也就是设定一个ε(比如0.9),90%的几率按照Q表数值最大Action行动,10%随机行动。每行动一次就要更新一下Q表。

3. 如何更新Q表

Q learning的算法就是如何更新Q表的方法。还是以表下为例:

Q table (States\Actions)left (A1)right (A2)up (A3)down (A4)
S0-13-12
S112-11

当机器人处于S0的状态时,如果刚好选择了A2,那么下一个状态就是S1(注意有10%的概率会选择其他的Action, 而到达其他的状态)。行动之后,我们就需要更新Q(S0,A2)的数值, 先给结果吧:

Q(S0,A2) = Q(S0,A2) + α[R(S1) + γ*maxa Q(S1,a)-Q(S0,A2)]

解释一下

  • R(S1)是机器人在S1能活的的奖励(Reward)(该游戏除了陷阱的地方为-1,宝藏的地方为1,其他地方均为0)。
  • γ为衰减值。
  • maxa Q(S1,a)是S1状态下Q表数值最大的一个(这里是2)。
  • α是学习速率(Learning Rate)。
  • R(S1) + γ*maxa Q(S1,a)是Q(S0,A2) 的目标数值。

那我们再把公式重写一遍就清楚了吧:

Q(S0,A2)新=Q(S0,A2) 旧 + α* [Q(S0,A2)目标 - Q(S0,A2)旧]

上面的公式像极了在线性回归中的梯度下降法(Gradient Descent)。只不过在线性回归我们更新权重W的方法,在这里我们更新Q表而已。

完整的公式如下:

 

4. 衰减值

这里再解释一下为什么要用衰减值 γ,从上面的公式可以看出,St 和 St+1是一个递归的关系。当机器人走到第n步的时候,会受到0到n-1每一步状态的影响。如果衰减值γ=1,那么每一步的影响都是一样的。γ在0到1之间,就可以让越靠近n的状态对第n步影响越大,之前的状态随着行动的增加,影响力会越来越小。



作者:Hongtao洪滔
链接:https://www.jianshu.com/p/1db893f2c8e4
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

### Q-Learning 算法介绍 Q-Learning 是一种基于值迭代的强化学习算法,属于无模型(model-free)的学习方法。它通过更新状态-动作价值函数 \( Q(s, a) \),使得智能体能够学会在给定状态下采取最优的动作[^1]。 #### Q-Learning 的核心原理 Q-Learning 使用贝尔曼方程来指导其更新过程。具体来说,\( Q(s, a) \) 表示在当前状态 \( s \) 下执行动作 \( a \) 后所能获得的最大期望回报。该值可以通过以下公式逐步逼近: \[ Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha \cdot (r_{t+1} + \gamma \max_a Q(s_{t+1}, a) - Q(s_t, a_t)) \] 其中: - \( r_{t+1} \) 是即时奖励, - \( \alpha \) 是学习率, - \( \gamma \) 是折扣因子[^4]。 此公式的目的是让 \( Q(s, a) \) 不断接近真实的价值函数。 --- ### Q-Learning 实现方法 以下是 Q-Learning 的典型实现步骤以及 Python 代码示例。 #### Q-Learning 流程概述 1. 初始化 \( Q(s, a) \) 表格为零或随机值。 2. 对于每一个时间步 \( t \): - 根据策略选择一个动作 \( a_t \)(通常采用 ε-greedy 方法)。 - 执行动作并观察新的状态 \( s_{t+1} \) 和奖励 \( r_{t+1} \)。 - 更新 \( Q(s_t, a_t) \) 值。 3. 当达到终止条件时停止训练。 #### 面向对象的 Python 实现 下面是一个简单的 Q-Learning 算法实现,适用于 Treasure on Right 游戏场景[^5]。 ```python import numpy as np class QLearningAgent: def __init__(self, states, actions, learning_rate=0.1, discount_factor=0.9, epsilon=0.1): self.states = states self.actions = actions self.q_table = {s: {a: 0 for a in actions} for s in states} self.alpha = learning_rate self.gamma = discount_factor self.epsilon = epsilon def choose_action(self, state): if np.random.uniform(0, 1) < self.epsilon: action = np.random.choice(self.actions) else: q_values_of_state = self.q_table[state] max_q_value = max(q_values_of_state.values()) best_actions = [action for action, value in q_values_of_state.items() if value == max_q_value] action = np.random.choice(best_actions) return action def learn(self, state, action, reward, next_state): current_q = self.q_table[state][action] future_max_q = max(self.q_table[next_state].values()) new_q = current_q + self.alpha * (reward + self.gamma * future_max_q - current_q) self.q_table[state][action] = new_q # 示例运行 states = ['A', 'B', 'C'] actions = ['Left', 'Right'] agent = QLearningAgent(states, actions) state = 'A' for _ in range(10): # 进行几次模拟 action = agent.choose_action(state) if action == 'Right': next_state = 'B' reward = 1 elif action == 'Left': next_state = 'C' reward = -1 agent.learn(state, action, reward, next_state) state = next_state print(agent.q_table) ``` 上述代码定义了一个 Q-Learning 智能体类 `QLearningAgent`,并通过循环演示了如何使用该类完成一次简单的训练过程[^3]。 --- ### 应用实例与扩展 Q-Learning 可应用于多种实际问题,例如机器人路径规划、自动驾驶决策支持等。此外,还有 Double Q-Learning (DQL)[^2] 等改进版本用于缓解高估偏差的问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值