通俗易懂讲透 Q-Learning:从零学会强化学习核心算法
通俗易懂讲透 Q-Learning从零学会强化学习核心算法Q-Learning 是无模型、基于价值迭代的经典强化学习算法核心就是让智能体通过不断试错记住每个状态下做什么动作收益最大最终学到最优决策策略。一、先搞懂Q-Learning 到底在干什么用迷宫寻宝一句话概括你在迷宫里找出口每走一步都有奖励/惩罚Q-Learning 就是帮你记一本“行动账本”记录在哪个位置、往哪边走最划算越走越聪明。核心逻辑3 步走探索一开始瞎走试试不同方向记录把每一步的好坏记在账本里Q 值利用后面按账本选最优动作少走弯路最终目标让智能体拿到最大的累计奖励。二、关键概念一看就懂1. Q 值动作价值函数全称Q(s, a)含义在状态 s下做动作 a未来能拿到的总收益简单说这个位置做这个动作“值不值”2. 贝尔曼方程Q 更新的依据这是 Q-Learning 的数学灵魂不用怕拆解开很简单Q(s, a) 当前奖励 r γ × 下一个状态的最大Q值r做完动作立刻拿到的奖励γ折扣因子未来奖励的重要程度0~1接近1更看重长远收益接近0只看眼前好处3. Q 值更新公式最重要Q(s,a) Q(s,a) α × [ r γ×maxQ(s,a) − Q(s,a) ]α学习率每次更新改多少0~1大学得快容易震荡小学得稳速度慢maxQ(s’,a’)下一个状态里最好动作的 Q 值一句话理解用“新的更好估计”去修正“旧的估计”。4. 探索 vs 利用核心矛盾探索Explore随机选动作找新路线利用Exploit按账本选最优动作ε-贪心策略ε概率随机探索1−ε概率选最优动作常用训练初期ε大后期ε慢慢减小三、Q-Learning 标准流程背下来也能用初始化 Q 表所有状态-动作对的 Q 值初始化为 0 或小随机数。循环多轮训练episode把智能体放回起点用 ε-贪心选动作执行动作拿到奖励 r 和新状态 s’按公式更新 Q 值把当前状态换成新状态收敛后输出最优策略每个状态直接选 Q 值最大的动作。伪代码极简版初始化 Q 表全为0 设置 α, γ, ε for 每一轮训练: 初始化状态 s while 没到终点: 用ε-贪心选动作 a 执行a得到r, s 更新 Q(s,a) s s四、实战案例用 Q-Learning 走迷宫我们用一个9行8列迷宫手把手跑通代码本科生/研究生都能直接跑。1. 迷宫环境定义0可走路径1墙障碍物起点(0, 0)终点(8, 0)2. 奖励规则关键到终点10 奖励撞墙-1 惩罚每走一步-0.1鼓励快点到终点3. 完整可运行代码Pythonimportnumpyasnpimportmatplotlib.pyplotaspltimportmatplotlib.animationasanimation# 迷宫环境类classMaze:def__init__(self,maze):self.mazenp.array(maze)self.n_rows,self.n_colsself.maze.shape self.start(0,0)self.goal(8,0)self.stateself.startdefreset(self):self.stateself.startreturnself.statedefstep(self,action):row,colself.state# 0上 1右 2下 3左ifaction0:rowmax(0,row-1)elifaction1:colmin(self.n_cols-1,col1)elifaction2:rowmin(self.n_rows-1,row1)elifaction3:colmax(0,col-1)self.state(row,col)# 奖励设置ifself.stateself.goal:reward10doneTrueelifself.maze[row,col]1:reward-1doneTrueelse:reward-0.1doneFalsereturnself.state,reward,done# Q-Learning 智能体classQLearning:def__init__(self,env,alpha0.1,gamma0.9,epsilon0.3,episodes1000):self.envenv self.alphaalpha self.gammagamma self.epsilonepsilon self.episodesepisodes# Q表行×列×4个动作self.q_tablenp.zeros((env.n_rows,env.n_cols,4))self.path_per_episode[]defchoose_action(self,state):ifnp.random.rand()self.epsilon:returnnp.random.choice(4)else:row,colstatereturnnp.argmax(self.q_table[row,col])deftrain(self):forepisodeinrange(self.episodes):stateself.env.reset()doneFalsepath[state]whilenotdone:actionself.choose_action(state)next_state,reward,doneself.env.step(action)row,colstate next_r,next_cnext_state# Q值更新self.q_table[row,col,action]self.alpha*(rewardself.gamma*np.max(self.q_table[next_r,next_c])-self.q_table[row,col,action])statenext_state path.append(state)self.path_per_episode.append(path)ifstateself.env.goal:print(f第{episode1}轮到达终点)# 迷宫布局maze[[0,1,0,0,0,0,1,0],[0,1,0,1,1,0,1,0],[0,0,0,0,1,0,0,0],[1,1,1,0,1,1,1,1],[0,0,0,0,0,0,0,0],[0,1,1,1,1,1,1,1],[0,0,0,0,0,0,0,0],[1,1,1,1,1,1,1,0],[0,0,0,0,0,0,0,0]]# 初始化环境与智能体envMaze(maze)agentQLearning(env,episodes1000)agent.train()# 动态可视化训练过程fig,axplt.subplots(figsize(8,8))defupdate(frame):pathagent.path_per_episode[frame]renderenv.maze.copy()for(r,c)inpath:render[r,c]2ax.clear()ax.imshow(render,cmapcoolwarm,vmin0,vmax2)ax.set_title(f训练轮次{frame1})ax.text(0,0,S,colorwhite,fontweightbold)ax.text(0,8,G,colorwhite,fontweightbold)returnax anianimation.FuncAnimation(fig,update,frameslen(agent.path_per_episode),repeatFalse)plt.show()4. 代码说明一看就懂Maze 类管迷宫环境负责移动、给奖励QLearning 类管智能体选动作、更新 Q 表可视化动态展示每一轮的行走路径越到后面路径越短、越直五、Q-Learning 优缺点面试/论文必背优点无模型不用知道环境规则直接交互学习简单稳定公式清晰容易实现收敛保证满足条件时一定能学到最优策略缺点维度灾难状态/动作一多Q 表巨大存不下收敛慢高维空间需要大量训练连续空间不行只能处理离散状态/动作六、适用场景与实际应用适用前提状态和动作必须离散有明确奖励/惩罚能充分探索状态空间实际落地场景游戏 AI走迷宫、贪吃蛇、简单棋类机器人路径规划AGV 小车、避障导航资源调度数据中心负载、带宽分配广告/推荐优化投放策略、点击率最大化七、总结最核心的 3 句话Q-Learning 记 Q 表 按贝尔曼方程更新动作选择靠ε-贪心平衡探索与利用适合离散、小状态空间大场景用 DQN 改进