马尔科夫决策过程(MDP):汽车租赁问题
汽车租赁问题:
杰克是一家汽车租赁公司的经理,他管理着两个汽车租赁点。每天都有一些人在不同的租赁点租车,每出租一辆杰克会得到200¥的奖励,汽车被归还后第二天才能被再次出租。为了尽可能满足广大客户的需求,同时也为了获得更多的现金奖励,杰克计划在两个租赁点之间进行灵活的资源调配,在夜间进行两个租赁点的车辆转移,以满足第二天的租赁需求,两地之间移动车辆的费用是40¥/辆,每次移动车辆的上限是5(辆),每个租赁点的容量上限是20,当一个租赁点容量达到上限后,车辆会归还到就近的其他租赁点。杰克是个大聪明,他很快就意识到这是一个连续的马尔可夫决策过程,而且状态和动作空间还是有限的。他当即就决定采用强化学习来帮自己找到一个最优的策略,在控制成本的同时,获得更多的收益。
问题抽象和假设
- sss : 每个租赁点结束营业后,可用车辆的数量
- A\mathcal AA : [-5, 5],正数:表示租赁点1→\to→租赁点2移动的车辆,负数:租赁点2→\to→租赁点1
- ttt : time step 天
- γ\gammaγ : discount 0.9
- 假设:每个租赁点的租车需求量和归还量是服从泊松分布的随机变量。
- λnn!e−λ\frac{\lambda^n}{n!}e^{-\lambda}n!λne−λ
- 租赁点1:λ=(3,4)\lambda = (3, 4)λ=(3,4)(需求,归还)
- 租赁点2:λ=(3,2)\lambda = (3, 2)λ=(3,2)(需求,归还)
- 泊松分布的期望和方差均为λ\lambdaλ
模拟求解
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from matplotlib import cm
from scipy.stats import poisson
# 每个租赁点最大容量
MAX_CARS = 20
# 每次最多移动车辆
MAX_MOVE_CARS = 5
# 租赁点1每日租车需求量的期望和方差
RENTAL1_REQUEST = 3
RENTAL2_REQUEST = 4
# 租赁点1每日还车量的期望和方差
RENTAL1_RETURNS = 3
RENTAL2_RETURNS = 2DISCOUNT = 0.9
# 租车奖励
RENTAL_CREDIT = 200
# 转移车辆价格
MOVE_CAR_COST = 40
# 动作空间
actions = np.arange(-MAX_MOVE_CARS, MAX_MOVE_CARS + 1)proba_cache = {} # global
def poisson_proba(n, lam):key = n * 10 + lamif key not in proba_cache:proba_cache[key] = poisson.pmf(n, lam)return proba_cache[key]
动作值函数
qπ(s,a)=∑s′,rp(s′,r∣s,a)(r+vπ(s′))q_{\pi}(s, a) = \sum_{s',r}p(s',r|s,a)\big(r + v_{\pi}(s')\big)qπ(s,a)=s′,r∑p(s′,r∣s,a)(r+vπ(s′))
def expect_return(state, action, state_value, constant_returned_cars, bounds):'''state = (num_cars_rental1, num_cars_rental2)bounds = (num1, num2),request bound, return bound,租还上限'''# init returnreturns = 0# move costreturns -= MOVE_CAR_COST * abs(action)# move carsNUM_CARS_RENTAL1 = min(state[0] - action, MAX_CARS)NUM_CARS_RENTAL2 = min(state[1] + action, MAX_CARS)# 遍历所有的request,return组合for request_num1 in range(bounds[0]):for request_num2 in range(bounds[1]):# 每一种需求组合的概率req_proba = poisson_proba(request_num1, RENTAL1_REQUEST) * poisson_proba(request_num2, RENTAL2_REQUEST)num_cars_rental1 = NUM_CARS_RENTAL1num_cars_rental2 = NUM_CARS_RENTAL2# 实际可满足的需求valid_rental1 = min(num_cars_rental1, request_num1)valid_rental2 = min(num_cars_rental2, request_num2)# rewardreward = (valid_rental1 + valid_rental2) * RENTAL_CREDITnum_cars_rental1 -= valid_rental1num_cars_rental2 -= valid_rental2# 固定的return数量均值if constant_returned_cars:returned_num1 = RENTAL1_RETURNSreturned_num2 = RENTAL2_RETURNS# new statenum_cars_rental1 = min(num_cars_rental1 + returned_num1, MAX_CARS)num_cars_rental2 = min(num_cars_rental2 + returned_num2, MAX_CARS)returns += req_proba * (reward + DISCOUNT * state_value[num_cars_rental1, num_cars_rental2])else:# 每种return组合的概率for returned_num1 in range(bounds[0]):for returned_num2 in range(bounds[1]):ret_proba = poisson_proba(returned_num1, RENTAL1_RETURNS) * poisson_proba(returned_num1, returned_num2)# new statenum_cars_rental1 = min(num_cars_rental1 + returned_num1, MAX_CARS)num_cars_rental2 = min(num_cars_rental2 + returned_num2, MAX_CARS)# p(s'|s,a)proba = req_proba * ret_probareturns += proba * (reward + DISCOUNT * state_value[num_cars_rental1, num_cars_rental2])return returns
策略迭代
- Policy Iteration
π0⟶Evπ0⟶Iπ1⟶Evπ1⟶Iπ2⟶Evπ2⟶I...π∗⟶Evπ∗\pi_0 \stackrel{E}{\longrightarrow}v_{\pi_0}\stackrel{I}{\longrightarrow}{\pi_1}\stackrel{E}{\longrightarrow}v_{\pi_1}\stackrel{I}{\longrightarrow}{\pi_2}\stackrel{E}{\longrightarrow}v_{\pi_2}\stackrel{I}{\longrightarrow}...\pi_*\stackrel{E}{\longrightarrow}v_{\pi_*}π0⟶Evπ0⟶Iπ1⟶Evπ1⟶Iπ2⟶Evπ2⟶I...π∗⟶Evπ∗
- E:Policy Evaluation
vk+1(s)=Eπ[Rt+1+γvk(St+1)∣St=s]v_{k+1}(s) = E_{\pi}[R_{t+1} + \gamma v_k(S_{t+1})|S_t = s ]vk+1(s)=Eπ[Rt+1+γvk(St+1)∣St=s]
- I:Policy Improvement
πk+1(s)=argmaxaqπk(s,a)\pi_{k+1}(s) = \mathop{argmax}\limits_{a}q_{\pi_k}(s,a)πk+1(s)=aargmaxqπk(s,a)
def policy_evalution(value, policy, constant_returned_cars, bounds=(11, 11)):while True:old_value = value.copy()for i in range(MAX_CARS+1):for j in range(MAX_CARS+1):new_state_value = expect_return((i, j), policy[i, j], value, constant_returned_cars, bounds)# inplace updatevalue[i, j] = new_state_valuedelta = abs(old_value - value).max()if delta <= 1e-4:breakreturn value
def policy_improvement(value, policy, constant_returned_cars, bounds=(11, 11)):policy_stable = Truefor i in range(MAX_CARS+1):for j in range(MAX_CARS+1):old_action = policy[i, j]act_returns = []for action in actions:if (0 <= action <= i) or (-j <= action <= 0):act_returns.append(expect_return((i, j), action, value, constant_returned_cars, bounds))else:act_returns.append(-np.inf)new_action = actions[np.argmax(act_returns)]policy[i, j] = new_actionif policy_stable and old_action != new_action:policy_stable = Falsereturn policy, policy_stable
# init value policy
value = np.zeros((MAX_CARS+1, MAX_CARS+1))
policy = np.zeros_like(value, dtype=int)
iterations = 0
value_history = [value.copy()]
policy_history = [policy.copy()]
while True:# policy evaluation, change valuevalue = policy_evalution(value, policy, True)value_history.append(value.copy())# policy improvementpolicy, policy_stable = policy_improvement(value, policy, True)policy_history.append(policy.copy())iterations += 1if policy_stable:break
动作值可视化
策略的可视化
最优动作值
马尔科夫决策过程(MDP):汽车租赁问题相关推荐
- 强化学习note1——马尔科夫奖励过程MRP和马尔科夫决策过程MDP各个函数的定义与区别
马尔科夫奖励过程MRP 状态转移函数:P(St+1=s′∣st=s)P\left(S_{t+1}=s^{\prime} \mid s_{t}=s\right)P(St+1=s′∣st=s) 奖励函 ...
- 强化学习(二)马尔科夫决策过程(MDP)
在强化学习(一)模型基础中,我们讲到了强化学习模型的8个基本要素.但是仅凭这些要素还是无法使用强化学习来帮助我们解决问题的, 在讲到模型训练前,模型的简化也很重要,这一篇主要就是讲如何利用马尔科夫决策 ...
- 强化学习——马尔科夫决策过程 MDP
马尔可夫决策过程是强化学习里面的一个基本框架. 马尔可夫过程.马尔可夫反馈过程是马尔可夫决策过程的基础,所以本博客将会一并介绍. 文章目录 1. 马尔科夫过程 Markov Process,MP 1. ...
- 强化学习——day13 马尔科夫决策过程MDP
马尔科夫决策过程 简介 马尔可夫过程 随机过程 马尔可夫性质 马尔可夫过程 马尔可夫奖励过程 回报 价值函数 马尔可夫决策过程 策略 状态价值函数 动作价值函数 贝尔曼期望方程 蒙特卡洛方法 占用度量 ...
- 强化学习 马尔科夫决策过程(MDP)
1. 强化学习引入MDP的原因 强化学习的环境的状态转化模型,它可以表示为一个概率模型,即在状态下采取动作a,转到下一个状态s′的概率,表示为 如果按照真实的环境转化过程看,转化到下一个状态s′的概率 ...
- 马尔科夫决策过程(MDP)
聊一聊我对强化学习的理解 对应的代码请访问我的GitHub:fxyang-bupt(可能你进去之后发现什么都没有,那是因为我注册了新的账号还在整理,这并不影响你先follow一下我的GitHub~) ...
- 强化学习——day11 马尔科夫决策过程MDP
第 3 章 马尔可夫决策过程 3.1 简介 马尔可夫决策过程(Markov decision process,MDP)是强化学习的重要概念.要学好强化学习,我们首先要掌握马尔可夫决策过程的基础知识.前 ...
- 【强化学习入门】马尔科夫决策过程
本文介绍了马尔可夫决策过程,首先给出了马尔可夫决策过程的定义形式 ,其核心是在时序上的各种状态下如何选择最优决策得到最大回报的决策序列,通过贝尔曼方程得到累积回报函数:然后介绍两种基本的求解最优决策的 ...
- 强化学习课程笔记(二)——马尔科夫决策过程和动态规划寻找最优策略
参考材料 1.强化学习入门课程(英文)https://www.bilibili.com/video/av37295048 2.课程对应知乎讲解https://zhuanlan.zhihu.com/re ...
- 马尔科夫决策过程(MDP)五大元素
文章目录 什么是马尔科夫决策过程(Markove Decision Progress, MDP)? MDP五大元素 什么是决策规则(Decision Rules,DR) 什么是策略 什么是马尔科夫决策 ...
最新文章
- spring源码分析之spring-core总结篇
- linux哪些端口占用了,如何查看某个端口被谁占用(Linux如何查询哪些端口被占用)...
- linux平台下rpm方式和源码包方式安装mysql5.7
- java继承eclipse_Java-Maven(七):Eclipse中Maven依赖、聚合、继承特性
- 下列可以产生斜体字的html标签是,电子科技大学《网页设计与制作》20秋期末考试题目【标准答案】...
- 360私有云平台Elasticsearch服务初探
- 力扣35,搜索插入位置(JavaScript)
- 我的联想C467鲁大师检查配置
- RHCE 学习笔记(4)- 重定向,管道和VIM编辑器
- 月薪3W+,人才缺口高达19W,行业大牛5天带你零基础入门数据分析!
- 【学习笔记】子集生成的方法
- django创建模板报错:TemplateDoesNotExist at
- JS中编码的三种方法
- cortex-M3/M4 指令集
- 微分方程的Matlab解法
- PE头之IMAGE_OPTIONAL_HEADER解析
- 怎么用python画皮卡丘_实现童年宝可梦,教你用Python画一只属于自己的皮卡丘
- 考研数学:有理函数中多项式分解定理
- 你以为的匿名评价,原来并没真的匿名
- 静态工厂方法优缺点个人理解
热门文章
- 有生成的日志的监控电脑性能的软件吗_全链路监控:方案概述与对比,看完你就懂...
- 车载系统不识别 U盘
- docker java镜像_Docker容器引擎与架构
- 对于elemnet-ui的el-upload的使用总结(移除上传文件判断,action等问题)
- 【转】 C#泛型集合—Dictionary使用技巧
- GridView 导出到 Excel文件
- 高斯—若尔当(约当)消元法解异或方程组+bitset优化模板
- mybatis同时查询未知个数的表中数据(表名做为参数传递,联合查询union)
- Django part 6 ---Static File
- Dojo笔记(较旧)