本笔记对应教材中1.3节的内容,这一章所有的例子都围绕前面二节所讲的动态规划算法的核心公式:
前两期的回顾,没有看或者忘记的童鞋可以复习一下:
王源:【强化学习与最优控制】笔记(一)确定性问题的动态规划
王源:【强化学习与最优控制】笔记(二)随机性问题的动态规划
1 最短路问题
最短路问题定义:在一个图中求2个节点之间最短的路径。
最短路问题一般需要假设图中所有的圈的路径非负。因为如果有负的圈的话一直在这个圈子里绕就可以让路径趋于无穷小。
如上图中(a)所示是给出的无向图,节点5是我们的终点,节点1,2,3,4是起点。在这个最短路问题中比较关键的问题是如何定义stage?
由此可得DP的递推公式
这里需要注意的是因为最短路径所经过的节点数我们事先并不知道,如果拿经过节点数目作为stage的数目的话是比较困难的。因此我们在式(1.1)的
1.1 代码实现
代码主要分为两部分,其中第一部分是输入图的数据。networkx是一个图论计算的包,用它来做一些图论方面的计算非常方便。我们先通过networkx建立一个无向图,然后添加节点,添加边(包含每条边上的权值),对应下面代码 G.add_weighted_edges_from([(0,1,6),(0,2,5),(0,3,2),(0,4,2),(1,2,0.5),(1,3,5),(1,4,7),(2,3,1),(2,4,5),(3,4,3)]),其中(0,1,6)就表示节点0和节点1直接有边连接,并且其权值为6,以此类推,我们按照教材中如图1.1所示把图的边的权值输入进去。Adjacency Matrix矩阵表示图的领接矩阵,对应代码中就是A矩阵,A矩阵中(i,j)的元素就是节点
import networkx as nx
import numpy as np
G = nx.Graph()
G.add_nodes_from(range(0,5))
G.add_weighted_edges_from([(0,1,6),(0,2,5),(0,3,2),(0,4,2),(1,2,0.5),(1,3,5),(1,4,7),(2,3,1),(2,4,5),(3,4,3)])
A = nx.adjacency_matrix(G)
A = A.todense()
print(A)
第二部分是根据公式
nStage, nState = nx.number_of_nodes(G), nx.number_of_nodes(G)
costToGoValue = np.zeros((nStage, nState))
t = 4
costToGoValue[:,-1] = A[:,t].reshape((5))
for k in range(nStage-2,-1,-1):
for i in range(nState):
costToGoValue[i,k] = min([A[i,j] + costToGoValue[j,k+1] for j in range(nState)])
print(costToGoValue)
其实到这来还不算真正的完结,我们仅仅是算出了
2 组合优化问题
很多组合优化问题都可以采用动态规划的框架来求解,关于组合优化问题采用动态规划/强化学习的求解大家可以看一下这个回答,我这边就不赘述了。
现在研究强化学习+组合优化的paper不少了(几十篇+),但方法似乎就这么几种,对此您怎么看?
当然需要强调的是采用动态规划直接暴力求解组合优化问题依然是NP-hard的,但是很多时候我们只需要近似求解即可。尤其是对cost to go function的近似,可以把数学优化里边的各种Programming,各种Relaxation方法,各种Cut的方法,各种启发式算法与动态规划/强化学习结合起来,个人感觉未来将会是组合优化问题有所突破的地方。AlphaGo的成功其实某种程度上已经证明了这一点。对这方面感兴趣的童鞋可以参考这篇文章:Bertsekas D. Rollout algorithms for discrete optimization: A survey[J]. Handbook of Combinatorial Optimization, D. Zu and P. Pardalos, Eds. Springer, 20,随着后续章节的展开,我们会在后边详细介绍这部分内容,此处就不过多展开介绍了。
感谢Yuchao提出的建议,补充一篇新的参考文献关于Rollout算法方面的:Constrained Multiagent Rollout and Multidimensional Assignment with the Auction Algorithm
3 Linear Quadratic Optimal Control
我们以钢铁生产中的加热炉为例来讲解 Linear Quadratic Optimal Control,如下图所示是钢铁材料在加热炉中的示意图:
从图中可以看到,钢铁材料有一个初始问题,然后经过了2个加热炉(本问题中设定N=2)后会得到最终的温度。由此我们可以定义
动态系统:
其中
目标函数有两项,一是让最终出炉的温度
其中
我们先暂时不考虑其它的约束条件,可以看出目标函数是一个二次项,而动态系统是一个线性系统,所以这个问题被称为 Linear Quadratic Optimal Control,请记住这个问题的形式,因为很多的复杂的 控制问题可以转化为 Linear Quadratic Optimal Control
易知
将上式对
由此可得:
将最优的policy(3.8)反带回到 (3.5)中可得
然后进入到前一阶段可得:
同理对
这个例子告诉我们非常重要的一个结论就是 目标函数是凸二次的(Bertsekas书中原文写的是二次的,没有特别强调凸,我觉得是要加上凸才能满足全局最优的条件),动态系统是线性的,也就是我们所说的 Linear Quadratic Optimal Control,这个问题的性质比较好可以直接得到
Linear Quadratic Optimal Control 其实在很多领域都有广泛的应用,例如机器人中机械臂的控制(俗称LQR),下面视频中的倒立摆就是通过Linear Quadratic Optimal Control 来实现的:
知乎视频www.zhihu.com例如对无人车的控制(车的位置,速度,加速度显然也是一个动态系统)
知乎视频www.zhihu.com所以Linear Quadratic Optimal Control和动态规划不只是有干巴巴的理论推导也都有着十分广泛的应用。最后想学习强化学习和最优控制但还没购买教材的童鞋可以戳