第1章:序贯决策问题的建模
在计算机上求解任何物理问题(尤其是任何序贯决策问题)的过程都需要构建一个数学模型,如图 1.1 所示。几十年来,研究界一直使用一个标准的数学框架来处理所有数据都提前已知的决策问题(称为确定性优化)。确定性优化问题的一个简单版本,被称为线性规划,可以写作
\[\begin{align} \min_x c^T x, \label{eq:linearprogram1} \end{align}\]其中 $x$ 是一个元素向量,必须满足一组通常写作如下的约束条件
\[\begin{align} A x & = b, \label{eq:linearprogram2}\\ x & \geq 0. \label{eq:linearprogram3} \end{align}\]
理解方程 $\eqref{eq:linearprogram1}$–$\eqref{eq:linearprogram3}$(这需要具备线性代数的基础知识)并非必要,但每年都有成千上万的学生从相关课程毕业,他们在课程中学习这种记号,也学习如何将各种各样的物理问题转化为这种记号。之后,有各种软件包能将这种格式的问题转化为解答。最重要的是,这种记号语言是全世界通用的。对于统计建模/机器学习,也可以做出同样的论断,如今这一领域的从业者群体规模远大于理解方程 $\eqref{eq:linearprogram1}$–$\eqref{eq:linearprogram3}$ 的人群。
但对于序贯决策问题,我们无法做出同样的论断,这是一个至少被15个不同学科群体研究的问题类别,它们使用八种根本不同的记号风格,往往还需要用到高深的数学知识。在本书中,我们采用一种”以实例教学”的风格,展示如何为这一极其丰富的问题类别——我们称之为序贯决策问题——建模。虽然我们关注的是相对简单的问题,但我们的框架可以用来为任何序贯决策问题建模。此外,所得到的模型可以直接转化为软件。
本书的分析基础包含在《Reinforcement Learning and Stochastic Optimization: A unified framework for sequential decisions》(RLSO)一书中,那是一本以方法论为核心的研究生级别教材。我们会不时提及该书中的内容,供有兴趣深入了解的读者参考,也鼓励有技术background的读者将RLSO作为参考资料。不过,这并非必需。本书旨在通过一系列示例提供背景知识,使读者能够对序贯决策问题进行清晰、精确的思考,即便他们永远不会编写一行代码。
本书面向修读过概率与统计课程的本科生或硕士生(不需要具备线性规划的知识,尽管我们有一个例子需要求解一个线性规划问题)。除了第 1 章(提供整个建模框架的概述)和第 7 章(在这一章中,我们会停下来利用前六章的内容来说明一些重要原则)之外,所有章节都围绕具体的示例展开。
本书的讲解不需要超出概率与统计入门课程所要求的数学知识。也就是说,本书的核心是展示如何使用足够精确的记号来描述序贯决策问题,使其能够成为计算机软件的基础。
大多数章节都配有Python模块;这些模块是围绕贯穿全书的建模框架编写的。同时,任何用于模拟序贯决策问题的软件包,无论其求解方式如何,都可以直接转化为我们所使用的建模框架。因此,我们鼓励读者将任何一段记号都视为计算机程序中的一个变量。
入门须知
序贯决策问题总是可以写成
\[decision,\ information, \ decision, \ information, \ decision, \ldots\]每次我们做出决策时,都会产生成本或获得贡献或奖励(衡量绩效的方法有很多种)。决策是通过一种我们称之为策略的方法来制定的。本书的核心目标之一,是设计出能够在信息尚未到来的不确定性下、长期表现良好的有效策略。
序贯决策问题无处不在,几乎出现在人类的每一个过程中。表 1.1 列出了一些领域的示例,以及这些领域中可能出现的一些决策。这些领域中的大多数可能都存在许多不同类型的决策,其复杂程度从何时出售一项资产或采用一种新的网页设计,到选择最佳的药物、材料或设施进行设计,再到管理复杂的供应链或调度一支卡车车队,不一而足。
| 领域 | 问题 |
|---|---|
| 商业 | 我们应该销售什么产品,具有哪些特性?应该使用哪些供应商?应该定价多少? |
| 经济学 | 根据经济状况,美联储应该设定怎样的利率?应该提供多大程度的市场流动性? |
| 金融 | 投资组合应该投资哪些股票?交易员应该如何对冲合约的潜在下行风险? |
| 互联网 | 我们应该展示哪些广告以最大化广告点击量?哪些电影最能吸引关注?应该何时/如何发送大规模通知? |
| 工程 | 如何设计从喷雾罐到电动汽车、从桥梁到交通系统、从晶体管到计算机的各种设备? |
| 公共卫生 | 我们应该如何进行检测以估计疾病的传播进程?应该如何分配疫苗?应该针对哪些人群? |
| 医学研究 | 哪种分子结构能产生杀死最多癌细胞的药物?生产单壁纳米管需要哪些步骤? |
| 供应链管理 | 我们应该何时向中国下达库存订单?应该使用哪家供应商? |
| 货运运输 | 应该由哪位司机来运送货物?整车运输承运商应该承诺运送哪些货物?司机应该驻扎在哪里? |
| 信息收集 | 我们应该将无人机派往何处以收集有关野火或入侵物种的信息?应该测试哪种药物来对抗某种疾病? |
| 多智能体系统 | 在寡头垄断市场中,一家大公司应该如何在预见竞争对手反应的情况下对合同进行投标? |
| 算法 | 在搜索算法中应该使用什么样的步长规则?我们如何确定评估某个昂贵函数的下一个点? |
表 1.1。 不同领域及每个领域内需要做出的决策示例。
比列出所有类型的决策更具挑战性的,是识别许多应用中出现的不同不确定性来源。人类行为、市场、物理过程、交通网络、能源系统,以及健康领域中出现的广泛的不确定性,都暗示了不确定性来源的多样性。
在撰写本书之际,人类正在与COVID-19各种变种的传播作斗争。应对这场大流行病被描述为”复杂得令人难以置信”[《今日美国》,2020年9月8日],但这实际上是未能以结构化方式思考该问题所导致的结果。我们将向读者展示,如何将问题分解为一系列基本组成部分,从而得出切实可行的解决方案。
我们的方法首先要识别一些核心要素,例如绩效指标、决策以及不确定性来源,然后据此建立问题的数学模型。下一步通常(但并非总是)是在计算机上实现该模型,但也会有许多问题,出于种种原因,构建计算机模型是不切实际的。因此,我们也将考虑那些必须在现场测试和评估想法的问题。要提高绩效,我们首先需要学习如何随时间推移做出良好的决策(这就是我们控制系统的方式)。然后,我们再转向系统的设计。
目前,学术界尚未针对序贯决策问题采用统一的标准建模流程。这与静态、确定性优化问题领域形成了鲜明对比,后者自20世纪50年代以来一直遵循严格的框架(方程 $\eqref{eq:linearprogram1}$–$\eqref{eq:linearprogram3}$ 展示了这一框架的一个示例)。我们的建模流程基于RLSO一书中的阐述,那本书面向的是主要对在计算机上开发和实现模型感兴趣的技术型读者。
相比之下,本书面向更广泛的读者群体,他们首先且最主要地是希望学习如何思考序贯决策问题。本书采用一种”以实例教学”的风格,重点传达建模过程,我们认为这一过程即便最终不构建计算机模型也同样有用。我们方法的核心是建立一个数学模型,从而消除用日常英语描述问题时存在的歧义。对于有兴趣开发计算机模型的读者而言,记号是通往编写软件的垫脚石。但我们主要会使用数学记号来在描述问题时创造清晰性,即使读者根本不打算编写任何代码。
本书的内容安排如下:
- 第 1 章对通用建模框架做了简要介绍,通过两个库存问题(一个简单的,一个稍微复杂一些的)加以说明,随后简要讨论了不确定性建模。接着介绍了涵盖所有决策制定方法的四类策略。
- 第 2–6 章各自描述一个具体的序贯决策问题,以”以实例教学”的风格来说明建模框架。选择这些应用是为了体现四类策略中的每一种。
- 第 7 章更详细地回归通用建模框架。利用第 2–6 章的示例作为背景,对四类策略以及不同类型的状态变量进行了更为细致的讨论。
- 第 8–14 章提供了更多示例,使用更复杂的场景来说明更高级的建模概念,既涵盖不确定性建模(尤其是第 8 章中的电价建模),也涵盖更丰富的策略集合。
应用章节(第2–6章和第8–14章)都遵循相同的大纲结构。它们可以按任意顺序阅读,但需要注意的是,第2–6章中的应用较为简单,是为了说明四类策略中的每一种而选取的。对特定建模主题(例如状态变量、不确定性建模,或希望了解策略的不同示例)感兴趣的读者,可以略读各章,直接跳转到自己感兴趣的主题。
每章结尾都附有一系列习题,分为三类:
- 复习题——这些是简单的问题,可用于强化对本章阅读内容的基本理解。
- 问题求解题——这些引入了需要问题求解技能的建模挑战。
- 编程题——大多数章节都有依托一组 Python 模块的编程练习。最初以 Python 2 编写的 Python 模块,得益于德国卡尔斯鲁厄大学(Karlsruhe University)Dennis Djanka 教授所做的一次重大升级。新的库可以从 tinyurl.com/sdagithub 下载。其中一些问题需要对 Python 代码进行编程修改。
那么,什么是决策?
关于人们如何做决策的研究,其历史可以追溯到 2000 多年前苏格拉底(Socrates)、亚里士多德(Aristotle)和柏拉图(Plato)的时代。此外,自 20 世纪 50 年代以来(也有一些重要工作出现得更早),关于如何做出最优决策的数学研究文献也相当可观,包含数以千计的论文和著作。这些文献似乎忽略了一个基本问题:
什么是决策?
我们从这样一个观察出发:决策是一种信息形式,它会影响我们试图控制的某个”系统”的行为。这个系统隐含着一个或多个用于量化系统运行表现的度量指标。然后,我们需要确定一个控制该系统某方面的智能体(agent)。
基于这一基础,识别出三类信息会很有帮助:
- 知识状态——这是我们当前拥有的、与系统性能相关的信息。
- 我们所控制的、会改变知识状态的信息(这需要为我们的系统确定一个控制智能体)。
- 到达我们系统的、会改变知识状态但超出我们控制范围的信息。
我们将第 2 类信息称为决策。这提示我们可以给出决策的一个正式定义,取自《架起决策问题之桥,第一卷:问题的构建》(Bridging Decision Problems, Volume I: Framing the Problem):
定义(正式): 决策是一种内生可控的信息类别。
一个非正式的定义可能是:
定义(非正式): 决策是我们所控制的东西。
这些定义提供了一个起点,但我们从中学到的东西并不多。更有意思的是识别决策的具体例子,这是我们接下来要做的。
决策的类型
我们基于所处情境以及可能用来确定最佳决策的工具,识别出了 10 种类型的决策。它们是:
1)物理与财务决策——这些决策产生于对物理和财务资源的管理中,例如人员、设备、设施、产品、水、能源,以及现金或投资等财务资源。决策包括购买、出售和修改资源,其中”修改”可能意味着将其从一个地点移动到另一个地点、维修设备、培训人员,或将原料组合起来制作蛋糕。
2)复杂/战略决策——这些决策可能对系统做出多重改变(改变资源、参数、信念),并且通常涉及重大的不确定性来源。这些决策通常只被评估一次,但也可能存在等待并在之后再做决策的选择。
3)信息获取/观测决策——包括诸如在实验室中进行实验、现场测试或计算机模拟等决策。它可能包括开展市场调研、聘请专家,或向大型语言模型提问。
4)信息交流/共享决策——这些决策有两种形式:
- a) 信息传递——反映我们在文本、视频和/或音频中所表达的内容。
- b) 渠道与时机——涵盖如何发送信息的选择:文本/电子邮件、出版(印刷或在线)、社交媒体,或广告渠道。这也需要选择发送的时机和频率。
5)绩效指标与目标——这代表了一个关键的选择,即量化我们试图实现的目标,例如最大化收入、最小化成本、最小化患病人数,或最大化获得的选票。
6)函数选择——这些可能是做决策的方法(策略)、优化模型的构建方式、绩效指标的选择、预测或估计的方法,或转移函数的设计(例如疾病如何传播)。
7)参数设定——通常有若干参数会影响系统的性能。这些参数可能是价格、统计模型中的系数、制造过程中所用的温度。也可能是赋予某一绩效指标的权重,或绩效目标。
8)估计或识别——我们可能需要识别一个人、预测需求,或命名一种疾病。
9)特征与行为——如何设计一款产品、一个软件包应具备哪些功能、应向客户提供哪些服务,或学生应选择的专业方向,这决定了他们毕业时具备的技能。
10)决定要决定什么——虽然我们通常不会对这最后一项决策使用正式分析,但认识到我们何时正在做决策,以及是否希望通过数据分析和建模正式处理这一决策,是很重要的。
在识别决策的过程中,隐含着理解该决策如何影响系统性能。移动物理资源(第 1 类)会产生成本,而满足需求会带来收入。一项决策可能对一个或多个绩效指标产生即时影响(这在资源管理中经常发生),但决策往往需要在一段时间内进行评估,并且依赖于决策做出时尚不可知的信息。正因如此,我们常常评估的是我们如何做决策(即方法),而不是决策本身。
问题的构建
处理决策问题的第一步涉及回答三个问题:
- 绩效指标是什么?
- 正在做出哪些类型的决策(以及由谁做出)?
- 影响绩效的不确定性有哪些?
请注意,这些问题的答案对任何决策问题而言都是根本性的。在本书中,这些问题看起来会相当简单,因为我们是在已经为解决某个问题而设计好的模型背景下回答它们的。而在实际应用中,绩效指标、决策和不确定性的清单可能相当冗长。
作为对问题构建过程所能达到的丰富程度的一点提示,我们鼓励读者查阅专著《问题的构建》(Framing the Problem),该书正是专门探讨这一主题的。这本专著用整整几章的篇幅分别探讨这些问题,并通过十几种不同的应用加以说明。
问题构建过程的目标是识别真正重要的东西,首先是从绩效指标开始——即使是一个简单的库存问题,也可以用超过 20 个绩效指标、30 种不同类型的决策以及超过 30 种不确定性来描述。列出这些内容的电子表格可以在 tinyurl.com/PowellInventoryDecisions 找到。这并不意味着我们真的要构建一个包含如此复杂程度的模型。因此,本书引入了一种称为交互矩阵(interaction matrices)的工具,由领域专家对指标进行优先级排序,然后运用判断力来识别对最重要指标影响最大的决策和不确定性。
本书假设我们已经将一个问题简化为少量的指标、决策和不确定性,并以此为重点来构建数学模型。
建模过程
建模是一门艺术,但这门艺术是在一个数学框架的指导下进行的,该框架确保我们能得到一个定义良好、可以放到计算机上求解的问题。这可以看作是从一个杂乱、定义不清的现实世界问题,架起一座通往计算机能够理解的清晰表述的桥梁——即便你的最终目标并非要将其放到计算机上求解。
从历史上看,如果一项建模工作涉及试图做出决策,人们通常会求助于众所周知的确定性优化框架,它通常呈现为方程 $\eqref{eq:linearprogram1}$–$\eqref{eq:linearprogram3}$ 所给出的模型形式,其中包括决策变量 $x$、目标函数 $cx$,以及由 $\eqref{eq:linearprogram2}$–$\eqref{eq:linearprogram3}$ 给出的约束条件。
这种经典建模框架的问题在于它所遗漏的内容:
- 它假设表征该模型的所有数据(包含在变量 $A$、$b$ 和 $c$ 中)都是完全已知的。
- 大多数决策会随时间反复发生,然而这一点却没有被体现出来。
- 没有办法表示信息流向系统的过程。
- 作为副产品,该模型的最优解无法预见到那些会在实际应用中影响 $x$ 表现的事件。
- 没有办法表示风险,而这在许多应用中是一个重大问题。
- 它假设只有单一的决策者。
数学模型首先且最重要的是,应当提供一条指引我们如何思考问题的路径。遵循方程 $\eqref{eq:linearprogram1}$–$\eqref{eq:linearprogram3}$ 格式的经典确定性优化模型,完全忽略了与我们问题随时间演化相关的一切内容。
本书完全围绕一种称为通用建模框架(universal modeling framework)的建模方法展开设计。简而言之,它力图表示一个可控系统的任何方面。我们的默认模型将假设系统随着新信息的到来而随时间演化。
在本节中,我们将给出通用建模框架的一个非常简明的版本。然后,我们将首先用一个非常简单的库存问题来说明该框架,随后引入一些适度的扩展。在给出这些示例之后,我们将回过头来对通用建模框架进行更详细的介绍。
动态模型的简明呈现
我们首先观察到,任何序贯决策问题都可以用如下序列建模
\[(S_0,x_0,W_1,S_1,x_1,W_2, \ldots, S_t, x_t, W_{t+1}, \ldots, S_T),\]其中:
- $S_t$ 是状态变量,它捕获了我们所需要的一切信息,以便能够:
- a) 在时间 $t$ 做出决策。
- b) 在时间 $t$ 计算绩效指标。
- c) 在未来任何时刻计算 (a) 或 (b) 所需要的任何其他信息。
最好将 $S_t$ 视为时间 $t$ 时的信息状态,或者更一般地说,是知识状态。
- $x_t$ 代表决策变量,它捕获了我们所控制的要素,例如是否出售一栋房子、通过一个网络的路径选择、某种治疗所用药物的选择、产品的定价,或者用于运输一批货物的卡车选择。
-
$W_{t+1}$ 是我们做出决策 $x_t$ 之后到达的信息,它可能是一栋房子最终的成交价格、通过网络的行驶时间、患者对某种药物的反应、某产品在某一价格下的销量,以及我们做出初始分配之后新叫来的货运订单量。我们将 $W_{t+1}$ 中的信息视为来自我们系统之外,这意味着它超出了我们的控制范围。因此,我们将其称为外源信息。
在许多情境下,最好将 $W_{t+1}$ 视为一个依赖于当前状态 $S_t$ 和/或决策 $x_t$ 的函数 $W_{t+1}(S_t,x_t)$。我们将在下文对此做更详细的讨论。我们将使用 $W_{t+1}$ 作为默认记号,但需理解它可能受到状态 $S_t$ 或决策 $x_t$ 的影响。
决策 $x_t$ 由我们称之为策略的某种方法决定,我们将其记为 $X^\pi(S_t)$。符号 $\pi$ 携带了关于函数结构的信息,我们用一组潜在函数 $\Fcal$ 中的 $f$ 来表示该函数结构,以及由该函数结构所定义的任何可调参数 $\theta\in\Theta^f$。例如,一个库存策略可能是:只要库存低于 $\theta^{min}$ 就订购 $\theta^{order}$ 单位,这意味着可调参数为 $\theta = (\theta^{order}, \theta^{min})$。该函数的结构则是函数 $f$ 的一个示例。
我们假设有一个转移函数,它以状态 $S_t$、决策 $x_t$ 和外源信息 $W_{t+1}$ 作为输入,给出更新后的状态 $S_{t+1}$。转移函数是一组用于更新状态变量 $S_t$ 每个元素的方程,状态变量可能只有一个元素,也可能有成千上万个(甚至更多)。
当我们在状态 $S_t$ 所包含的信息下做出决策 $x_t=X^\pi(S_t)$ 时,我们会产生贡献(或成本)$C(S_t,x_t)$。我们的目标是找到能够最大化某个依赖于贡献 $C(S_t,x_t)$(其中 $x_t=X^\pi(S_t)$)的目标的策略。对于更复杂的情形,$C(S_t,x_t)$ 实际上可能是一组绩效指标,尽管我们需要以某种方式将它们组合起来,以确定应该选择哪个决策 $x_t$。
这是对序贯决策问题的一个非常简洁的描述。接下来我们将描述建模过程中需要遵循的一系列步骤。
建模过程中的步骤
(就我们的目的而言)可以将整个建模过程划分为七个步骤。在这些步骤之前(下面标记为”步骤 0”),是对应用技术复杂度的简要总结,以便为读者提供指引。
步骤 0. 章节摘要 —— 我们在每一章开头都会概述本章将要涵盖的内容,在某些情况下,还会说明本章内容与其他章节内容的关系。这些摘要指明了用于建模不确定性以及所使用策略的方法。
步骤 1. 叙述描述 —— 这是对问题的一个通俗英语描述。该叙述不会提供构建数学模型所需的全部信息;相反,它是第一步,旨在让建模者获得问题的整体图景,而不会陷入符号细节之中。
步骤 2. 问题的框架化 —— 这一步包括回答三个问题:
- 绩效指标是什么?
- 正在做出哪些类型的决策(在某些情况下,是哪个主体在做出决策)?
- 影响绩效的不确定性来源有哪些?
步骤 3. 识别问题的核心要素,特别强调任何序贯决策问题的三个维度。这些要素在描述时不使用数学语言:
- 我们试图影响哪些指标?各个具体领域(例如供应链管理、医疗、能源、金融)都会有各自的一系列指标,这些指标可能用成本、收入、利润、奖励、收益、损失、绩效和风险等术语来描述。
- 正在做出哪些决策?对于许多问题(例如电脑游戏)来说,识别决策相当容易,但如果我们处理的是诸如应对公共卫生事件、减少碳足迹或管理供应链这类复杂问题,那么识别所有决策可能相当具有挑战性。
- 存在哪些不同的不确定性来源?在我们开始之前,我们对什么不确定?随时间推移会有哪些外源信息到达(即在我们做出决策之后到达)?表 1.2 展示了新冠疫苗分配模型中不同的不确定性来源(关于 12 类不确定性的介绍,参见 RLSO 第 10 章)。
我们将回答这三个问题的过程称为问题的框架化。
| 不确定性类型 | 描述 |
|---|---|
| 1) 观测误差 | 观察出现症状的人;将有症状的人误判为感染新冠的错误 |
| 2) 外源不确定性 | 新增病例、死亡人数的报告;重症监护病床的可用性;疫苗的实际产量 |
| 3) 预后不确定性 | 住院情况;疫苗未来的效果;人群对疫苗的反应 |
| 4) 推断不确定性 | 感染率的估计;疫苗有效性的估计 |
| 5) 实验不确定性 | 临床试验中的药物效果;接种疫苗的人数 |
| 6) 模型不确定性 | 疾病传播率;感染的地理扩散 |
| 7) 转移不确定性 | 疫苗库存的增加/撤出 |
| 8) 控制不确定性 | 哪些人群接种了疫苗;疫苗分配方案 |
| 9) 实施不确定性 | 未能完成接种 |
| 10) 沟通错误 | 现场报告中的错误;未能及时通知何时接种 |
| 11) 目标不确定性 | 在应优先接种人群上的分歧 |
| 12) 环境不确定性 | 疫苗是否/何时获批;疫苗在不同州、国家之间的分配 |
表 1.2。新冠疫情疫苗接种应对中出现的不同类型不确定性示例。
步骤 4. 数学模型 —— 在这里,我们在步骤 2 中提出的前三个要素的基础上进一步构建,现在需要建立一个由五个维度组成的数学模型,这五个维度适用于每一个序贯决策问题:
- 状态变量 $S_t$ —— 状态变量捕获了在时间 $t$ 你需要知道的一切,以便在时间 $t$ 做出决策、计算成本和约束条件,并在必要时模拟推进到时间 $t+1$。状态变量可以包括关于物理资源的信息(库存或车辆位置等,这些信息通过约束条件进入问题)、其他信息(如成本或价格,这些信息进入目标函数),以及关于我们无法完全知晓的量和参数的信念(例如预测,或对患者对药物反应的估计)。
-
决策变量 $x_t$ —— 这些变量描述了我们将如何设计或控制我们的系统。决策必须满足我们写作 $x_t \in \Xcal$ 的约束条件,其中 $\Xcal$ 可以是一组离散选择,也可以是一组线性方程。决策将由策略确定,策略是我们记为 $X^\pi(S_t)$ 的函数(或规则),该函数根据状态变量中的内容确定 $x_t$。策略可以非常简单(低买高卖),也可以相当复杂。
下标 $\pi$ 携带了关于用于做出决策的函数类型以及任何可调参数的信息。设 $f\in\Fcal$ 为函数的结构,$\Fcal$ 为可能函数的集合,设 $\theta\in\Theta^f$ 为函数 $f$ 的任何可调参数。我们的策略于是可以表示为 $\pi = (f,\theta)$。我们通常将策略写作 $X^\pi(S_t\vert \theta)$,以表明其对可调参数的依赖关系。
我们将在本章后面以及全书中详细回到这个话题。书中给出的每个示例都经过精心挑选,用以说明特定类型的策略。
- 外源信息 $W_{t+1}$ —— 这是在我们做出决策 $x_t$ 之后(但在我们决定 $x_{t+1}$ 之前)到达的新信息,例如设定价格后我们卖出多少,或我们所选路径完成所需的时间。当我们在时间 $t$ 做出决策时,$W_{t+1}$ 中的信息是未知的,因此在我们选择 $x_t$ 时,我们将其视为随机变量处理。
- 转移函数 $S^M(S_t,x_t,W_{t+1})$ —— 这些是描述状态变量如何随时间演变的方程。对于许多实际问题而言,转移函数捕获了问题的全部动态过程,并且可能相当复杂。在某些情况下,我们甚至不知道这些方程,而只能依赖于我们能够观察到的状态变量。我们使用转移函数将状态变量的演变 $S_t$ 写作
其中 $S^M(\cdot)$ 被称为状态(或系统)转移模型(因此上标中出现 $M$)。转移函数描述了在给定决策 $x_t$ 和外源信息 $W_{t+1}$ 的情况下,状态变量每个元素如何变化。在复杂问题中,实现转移函数可能需要数千行代码。
-
目标函数 —— 这捕获了我们用来评估绩效的绩效指标,并为在策略空间中进行搜索提供了依据。我们令 $C(S_t,x_t)$ 表示决策 $x_t$ 的贡献(若为最大化)或成本(若为最小化),它可能依赖于 $S_t$ 中的信息。在某些情形下,将单期贡献函数写作 $C(S_t,x_t,W_{t+1})$ 更自然,即在观察到 $W_{t+1}$ 之后,在时间区间 $(t,t+1)$ 结束时评估的贡献函数。例如,我们可能下达一份 $x_t$ 的订单,该订单立即到货,以满足 $W_{t+1}$ 中包含的不确定需求。
我们的目标是找到最佳策略 $X^\pi(S_t)$,以优化某个指标,例如:
- 在某个时域内最大化贡献的期望总和。
- 最大化通过多次实验或观察所学得的最终设计的期望绩效。
- 最小化与最终设计相关的风险。
我们最常用的目标函数写法是
其中”$\E$”被称为期望算子,意味着它对任何随机的量求平均值,这可能包括初始状态 $S_0$ 中的不确定信息,以及外源信息过程 $W_1, \ldots, W_T$。标准做法是写出期望算子,但我们实际上永远无法真正计算出它。稍后我们将展示如何通过运行一系列模拟并取平均值,或通过在实地观察某个过程,来对其进行近似。
在解读方程 $\eqref{eq:baseobjectivefunction}$ 中的期望算子”$\E$”时必须谨慎。该算子的字面含义是”对任何不确定的量求平均值”。其中最明显的不确定性部分就是外源信息过程 $W_1, W_2, \ldots, W_t, \ldots, W_T$。
从(由叙述引导的)实际问题过渡到数学模型的各要素,或许是最困难的一步,因为这通常需要从非技术性的信息来源那里获取信息。
我们注意到,我们已经在没有说明如何做出决策(即由策略 $X^\pi(S_t)$ 表示的内容)的情况下,呈现了整个模型。我们将此称为”先建模,后求解“,这代表了与处理序贯决策问题的大量文献所采取方式的重大背离。要说清楚以这种方式处理序贯决策问题的重要性,实属不易。
步骤 5. 不确定性模型 —— 这是我们对不同类型不确定性进行建模的方式。将不确定性引入模型有两种途径:
- 通过初始状态 $S_0$,它可能为诸如患者对药物的反应或市场对价格的反应等不确定参数指定一个概率分布。
- 通过外源信息过程 $W_1, \ldots, W_T$。
我们有三种方法来对外源信息过程建模:
- 建立 $W_1, W_2, \ldots, W_T$ 的数学模型。
- 使用历史观测数据,例如过去的价格、销售量或天气事件。
- 在实地运行系统,实时观察 $W_t$ 的发生。
步骤 6. 设计策略 —— 策略是函数,因此我们必须搜索最佳函数。(没错,策略是用于选择最佳决策的函数,但选择策略本身也是一个决策!)为此,我们通过确定两大核心策略设计思路来完成这项工作:
- 在一族函数中进行搜索,找出随时间平均表现最佳的那一个。
- 通过估计某个决策 $x_t$ 的即时成本或贡献,加上对未来成本或贡献的近似,然后找出使当前与未来成本或贡献之和最优的选择 $x_t$,来构建一个策略。谷歌地图通过在穿越网络中下一条链路所需时间加上到达目的地的剩余时间上进行优化,来决定左转还是右转。一个库存决策可能会在订货成本加上前瞻持有一定库存的估计价值上进行优化。
我们将更明确地说明如何识别这些策略。后面有一节将介绍四类策略,它们将涵盖任何做决策的方法(这些是元类别)。
第7步。评估策略 —— 找到最佳策略意味着评估各种策略,以确定哪个最优。评估策略有两种方式:
- 在计算机模拟器中测试该策略。这需要对状态转移模型 $S^M(S_t,x_t,W_{t+1})$ 中更新状态变量 $S_t$ 所需的所有方程进行编程。这也意味着要能够生成 $W_{t+1}$ 的样本,这通常是模拟器中最微妙的部分。
- 观察该策略在实际场景中的表现。
模拟器可能十分复杂、难以构建,并且仍然会受到建模近似的影响。因此,实践中遇到的绝大多数实际问题往往涉及在现场进行测试,这既缓慢(模拟一天需要一天时间),又需要承受实验结果所带来的后果。
要让人对某个数学模型感到熟悉,唯一的方法就是用一个大家熟悉的例子来说明它。我们从一个我们在日常生活中都会遇到的普遍性问题开始:库存管理。
一些库存问题
我们将使用一个经典库存问题的两个变体来说明我们的建模框架,该问题被广泛用作说明求解序贯决策问题的某些方法的应用案例。我们先从一个简单的库存示例开始,它体现了我们建模框架的核心要素,同时让我们暂时忽略本书后续将探讨的许多复杂性。
然后,我们将过渡到一个略微更复杂的库存问题,借此说明一些建模原则。在全书中,我们也会采用这样的方式:先从某个问题的基本版本入手,然后引入一些扩展,从而暗示实际应用中可能出现的各种复杂情况。
一个简单的库存问题
我们每次去商店时都会遇到的最熟悉的序贯决策问题之一,就是库存问题。我们将使用这个问题的一个简单版本来说明上面介绍的建模流程的六个步骤:
第1步:叙述 —— 一家披萨餐厅需要决定向其食品分销商订购多少磅香肠。餐厅必须在第 $t$ 天结束时做出决策,传达订单,然后订单会在次日早上到达,以满足明天的订单需求。如果香肠有剩余,可以保留到第二天。香肠的成本,以及次日出售的价格,都是事先已知的,但需求量却是未知的。
第2步:该问题的核心要素为:
- 度量指标——我们希望最大化利润,即香肠的销售额减去购买香肠的成本。
- 决策——我们必须决定在某一天结束时订购多少数量,该数量将在次日开始时到货。
- 不确定性来源——这个简单模型中唯一的不确定性来源,是第二天对香肠的需求量。
第3步:数学模型 —— 该模型由五个要素组成。
1) 状态变量 $S_t$ —— 我们区分初始状态变量 $S_0$ 和动态状态变量 $S_t$(对于 $t > 0$ 而言)。初始状态变量 $S_0$ 由固定参数以及随时间变化的变量的初始值组成,由此得到
\[S_0 = (R^{inv}_0, (p, c), (\Dbar, \sigmabar^D)).\]我们将初始状态划分为三类变量:
- 资源状态 $R^{inv}_0$ 的初始值。
- 常量参数 $c$ 和 $p$ 的值。
- 我们对需求的信念,由均值为 $\Dbar$、标准差为 $\sigmabar^D$ 的正态分布给出。
动态状态变量 $S_t$ 就是我们的库存,我们将其记为 $R^{inv}_t$。目前,这是动态状态变量的唯一组成部分,因此
\[S_t = R^{inv}_t.\]之后我们会为状态变量引入更多的要素。
2) 决策变量 $x_t$ 是我们在时间 $t$ 订购的数量,我们(目前)假设它会立即到货。我们使用一个我们稍后会设计的策略 $X^\pi(S_t)$ 来做出决策。
3) 外源信息 是我们产品的随机需求,我们将其记为 $\Dhat_{t+1}$,因此 $W_{t+1} = \Dhat_{t+1}$。
4) 我们的转移函数 刻画了库存 $R_t$ 如何随时间演变,由下式给出
\[\begin{align} R^{inv}_{t+1} = \max\{0, R^{inv}_t+x_t-\Dhat_{t+1}\}. \label{eq:inventoryexampleequation} \end{align}\]5) 我们的目标函数。 对于我们的库存问题,最自然的做法是计算包括产品 $x_t$ 的购买成本,以及满足需求 $\Dhat_{t+1}$ 所带来的收入,这意味着我们单期的贡献函数可以写成
\[C(S_t,x_t,\Dhat_{t+1}) = -cx_t + p \min\{R^{inv}_t+x_t, \Dhat_{t+1}\},\]其中 $x_t = X^\pi(S_t)$。给定一个需求序列 $\Dhat_1, \ldots, \Dhat_T$,某个策略 $\Fhat^\pi$ 的价值将是
\[\Fhat^\pi(S_0) = \sum_{t=0}^T C(S_t,X^\pi(S_t),\Dhat_{t+1}).\]我们的利润 $\Fhat^\pi(S_0)$ 是随机的,因为它取决于某个特定的随机需求序列 $\Dhat_1, \ldots, \Dhat_T$。最后,我们通过取期望来对这些随机需求进行平均:
\[\begin{align} F^\pi(S_0) = \E \left\{\sum_{t=0}^T C(S_t,X^\pi(S_t),\Dhat_{t+1})\vert S_0\right\}. \label{eq:inventoryobjective} \end{align}\]这里,以初始状态 $S_0$ 为条件,可以理解为“基于我们最初所知的信息来取期望”。每当我们取期望时,以 $S_0$ 为条件都是隐含的,因此许多作者会将其省略。然而,我们将保留对 $S_0$ 的条件化处理,以明确说明如果我们的初始输入(包括信念)发生变化,可能会影响策略的表现。
第4步:不确定性模型 —— 建模不确定性的最简单方法就是直接使用历史数据。我们可能遇到的问题是,如果香肠售罄,我们可能无法观测到当天对香肠的全部需求。如果我们能够捕捉到这部分未被满足的需求,那么这种方法就是合理的。
另一种方法是构建一个数学模型。我们可以假设我们的需求服从均值为 $\Dbar$、标准差为 $\sigmabar^D$ 的正态分布。如果我们假设这两者都已知,我们可以将需求写成
\[\Dhat_{t+1} \sim N(\Dbar,(\sigmabar^D)^2),\]并利用能够从正态分布中抽样的软件包(例如,在Excel中这被称为 Norm.inv$(Rand(),\Dbar,\sigmabar)$)来生成一个均值为 $\Dbar$、标准差为 $\sigmabar$ 的随机观测值。
利用这个模型,我们可以生成一组需求 $(\Dhat_1, \Dhat_2, \ldots, \Dhat_T)$。然后,我们可以将此过程重复 $N$ 次,从而生成 $N$ 条包含 $T$ 个需求的序列,得到序列 $(\Dhat^n_1, \Dhat^n_2, \ldots, \Dhat^n_T)$(对于 $n=1, \ldots, N$ 而言),这正是我们在第6步中估计策略价值所需要的(我们将在下面用到它)。
第5步:设计策略 —— 接下来,我们必须设计一种确定订货量的方法。库存问题中常用的一种策略被称为“补货至上限”策略,其形式如下
\[\begin{align} X^\pi(S_t\vert \theta) = \begin{cases} \theta^{max} - R_t & \text{if } R_t < \theta^{min}, \\ 0 & \text{otherwise,}\end{cases} \label{eq:introorderupto} \end{align}\]其中 $\theta = (\theta^{min},\theta^{max})$ 是一组需要调优的参数。之所以称为“补货至上限”,是因为我们下订单是为了将库存补充“至”上限 $\theta^{max}$。
第6步:评估策略 —— 我们可以使用多种策略。在实践中,我们无法计算方程 $\eqref{eq:inventoryobjective}$ 中目标函数里的期望值,因此我们会取一系列需求样本。设 $\Dhat^n_1, \ldots, \Dhat^n_T$ 为在 $t=1, \ldots, T$ 上的一个需求样本,并假设我们能生成 $N$ 个这样的样本。现在,我们可以通过对 $n=1, \ldots, N$ 的样本取平均,来估计策略 $X^\pi(S_t)$ 的预期利润,其计算方式为
\[\Fbar^\pi(\theta\vert S_0) = \frac{1}{N} \sum_{n=1}^N \sum_{t=0}^T C(S_t,X^\pi(S_t\vert \theta),\Dhat^n_{t+1}).\]用通俗的话来说,我们是在使用模拟(或从历史中观测得到)的需求样本 $\Dhat^n_1, \ldots, \Dhat^n_T$,对策略 $X^\pi(S_t\vert \theta)$ 进行 $N$ 次模拟,然后对表现取平均以得到 $\Fbar^\pi(\theta\vert S_0)$。接下来我们面临的问题是找到 $\theta$ 的最优值。一个简单的策略是生成 $K$ 个可能的取值 $\theta_1, \ldots, \theta_K$,对每一个都进行模拟以求得对应的 $\Fbar^\pi(\theta_k\vert S_0)$(针对每个 $k$),然后选取表现最佳的 $\theta_k$ 值。这并非最优策略,但它提供了一个简单、实用的起点。
一个稍微更复杂的问题
上面的简单库存问题是演示一种求解序贯决策问题的特定方法——即所谓动态规划——的经典场景,该方法依赖于拥有一个简单的状态变量,该变量a) 是离散的,且b) 不具有过多可能取值。在我们这个稍微更复杂的库存问题中,我们将展示三种不同类型的状态变量,它们对于某种流行的求解序贯决策问题的方法而言会构成严重的复杂性,但对我们所选择的策略却没有影响。
第1步:叙述 —— 我们再次以那家需要订购香肠的披萨餐厅为例,但这次我们将允许我们所支付的香肠价格逐日变化,其中我们假设某一天的价格与前一天的价格是独立的。然后,我们还将假设,尽管明天香肠的需求是随机的,但我们会获得一个关于明天需求的预测,该预测尽管不完美,但比没有预测要好。除此之外,我们这个更复杂问题的其他方面都与之前相同。
第2步:核心要素 —— 这些要素为:
- 度量指标——我们希望最大化利润,即香肠的销售额减去购买香肠的成本,其中成本逐日变化。
- 决策——与我们较简单的库存问题一样,我们必须决定在某一天结束时订购多少数量,该数量将在次日开始时到货。
- 不确定性来源——现在有三个不确定性来源:实际需求与预测之间的差异、预测从一天到下一天的演变,以及我们为香肠支付的价格。
第3步:数学模型 —— 我们仍然拥有同样的五个要素,但现在问题变得更加丰富:
1) 为构建状态变量,我们需要列出模型中三个不同部分所需的信息(具体来说,是随时间演变的信息):(1) 目标函数,(2) 用于做决策的策略(其中包括约束条件),以及(3) 转移函数。当然,我们尚未介绍这些函数中的任何一个,因此你需要往后阅读,并验证我们的状态变量包含了计算这些函数所需的全部信息。可以把它想成是我们将需要的信息的一份词典。
我们从初始状态 $S_0$ 开始,它由常量参数,以及随时间变化的量和参数的初始值组成。它们是:
- 初始库存——我们从初始库存 $R_0$ 开始。
- 初始购买成本——$c_0$。
- 价格——我们假设以固定价格 $p$ 出售我们的香肠。
- 初始预测——我们假设第一个预测 $f^D_{0,1}$ 是已知的,其中 $f^D_{0,1}$ 是在时间0已知、针对时间1需求的预测。
- 需求标准差的初始估计——$\sigmabar^D_0$。
- 预测标准差的初始估计——$\sigmabar^f_0$。
这意味着我们的初始状态变量是
\[S_0 = (R_0,c_0, p, f^D_{0,1}, \sigmabar^D_0, \sigmabar^f_0).\]接下来,我们有随时间演变的信息,这些信息构成了我们的动态状态变量 $S_t$:
- 当前库存 $R^{inv}_t$ —— 时间区间 $(t,t+1)$ 开始时的库存。
- 购买成本 $c_t$ —— 这是在时间 $t$ 购买的香肠的成本,该信息在时间 $t$ 提供给我们。
- 需求预测 $f^D_{t,t+1}$ —— 这是基于我们在时间 $t$ 所知信息,对 $\Dhat_{t+1}$ 做出的预测。
- 需求标准差的当前估计——$\sigmabar^D_t$。
- 预测标准差的当前估计——$\sigmabar^f_t$。
我们的动态状态变量则由下式给出
\[S_t = (R^{inv}_t, c_t, f^D_{t,t+1}, \sigmabar^D_t, \sigmabar^f_t).\]2) 决策变量$x_t$是我们在时间$t$订购的数量,我们(暂时)假设它会立即到货。我们使用一个策略$X^\pi(S_t)$来做出决策,该策略我们将在后面设计。
3) 外源信息现在包括:
- 采购成本$\chat_{t+1}$——这是第$t+1$天香肠的采购成本,由外部指定。
- 预测——每个时间段我们都会得到一个新的预测。设$\varepsilon^f_{t+1}$为时间$t$与$t+1$之间预测的变化。
- 需求——最后,我们假设实际需求是相对于预测的一个随机偏差,可以写作
我们完整的外源信息变量集合现在可以写作
\[W_{t+1} = \big(\chat_{t+1}, \varepsilon^f_{t+1}, \varepsilon^D_{t+1}\big).\]4) 转移函数——该函数指定每个(动态)状态变量$S_t$如何随时间演化。我们使用以下方式更新库存:
\[\begin{align} R^{inv}_{t+1} &= \max\{0, R^{inv}_t + x_t - \Dhat_{t+1}\}. \label{eq:introcomplexinventorytransition1} \end{align}\]需求等于预测需求加上相对于预测的偏差$\varepsilon^D_{t+1}$,由此我们得到方程:
\[\begin{align} \Dhat_{t+1} &= f^D_{t,t+1} + \varepsilon^D_{t+1}. \label{eq:introcomplexinventorytransition2} \end{align}\]我们假设预测使用以下方式更新
\[\begin{align} f^D_{t+1,t+2} &= f^D_{t,t+1} + \varepsilon^f_{t+1}. \label{eq:introcomplexinventorytransition3} \end{align}\]接下来,我们将自适应地估计需求方差和需求预测的方差:
\[\begin{align} (\sigmabar^D_{t+1})^2 &= (1-\alpha)(\sigmabar^D_t)^2 + \alpha (f^D_{t,t+1} - \Dhat_{t+1})^2, \label{eq:introcomplexinventorytransition4}\\ (\sigmabar^f_{t+1})^2 &= (1-\alpha)(\sigmabar^f_t)^2 + \alpha (f^D_{t,t+1} - f^D_{t+1,t+2})^2, \label{eq:introcomplexinventorytransition5} \end{align}\]其中$0 < \alpha < 1$是一个平滑因子。
最后,我们用”观测成本”$\chat_{t+1}$更新成本$c_{t+1}$,简单地写作
\[\begin{align} c_{t+1} = \chat_{t+1}.\label{eq:introcomplexinventorytransition6} \end{align}\]方程$\eqref{eq:introcomplexinventorytransition6}$是一个我们观测而非计算得到的状态变量的示例,这与我们在$\eqref{eq:introcomplexinventorytransition1}$中对库存$R^{inv}_t$所做的处理不同。方程$\eqref{eq:introcomplexinventorytransition1}$有时被称为”基于模型的”,因为它反映了库存更新的物理规律,而方程$\eqref{eq:introcomplexinventorytransition6}$被称为”无模型的”,因为我们并未尝试对产生成本变化的潜在过程进行建模。
我们的转移函数$S_{t+1} = S^M(S_t,x_t,W_{t+1})$由方程$\eqref{eq:introcomplexinventorytransition1}$–$\eqref{eq:introcomplexinventorytransition6}$组成。
5) 最后,我们的单期贡献函数现在可以写作
\[C(S_t,x_t,\Dhat_{t+1}) = -c_tx_t + p \min\{R_t+x_t, \Dhat_{t+1}\},\]与较简单的库存问题唯一的不同之处在于,成本$c$现在是随时间变化的$c_t$。我们打破了将贡献写作$C(S_t,x_t)$的惯例,允许它包含来自需求$\Dhat_{t+1}$的收入。
我们现在正式陈述我们的目标函数为
\[\begin{align} \max_{\pi=(f,\theta)} \E \left\{\sum_{t=0}^T C(S_t,X^\pi(S_t\vert \theta),\Dhat_{t+1})\vert S_0\right\}. \label{eq:introcomplexinventoryobjective} \end{align}\]优化$\max_\pi$意味着我们在由$(f,\theta)$表示的所有可能策略中进行搜索,这实际上意味着在我们可能用来做出决策的所有不同函数中进行搜索。本书中的示例将展示我们如何在函数空间中进行搜索。
回忆一下,我们之前提到索引$\pi$携带了关于函数类型$f\in\Fcal$以及任何可调参数$\theta\in\Theta^f$的信息。在实践中,对函数类型$f\in\Fcal$的搜索往往是临时性的(一位经验丰富的分析师会选择对特定问题有意义的函数),而计算机算法则负责搜索$\theta\in\Theta^f$的最佳值。
步骤4. 不确定性模型——我们将假设外源变化$\varepsilon^D_{t+1}$和$\varepsilon^f_{t+1}$由均值为0、方差分别为$(\sigmabar^D_t)^2$和$(\sigmabar^f_t)^2$的正态分布来描述,我们将其表示为
\[\varepsilon^D_t \sim N(0, (\sigmabar^D_t)^2), \quad \varepsilon^f_t \sim N(0, (\sigmabar^f_t)^2).\]不确定性模型可能变得相当复杂,但这里将作为一个示例。
步骤5. 设计策略——接下来我们必须设计一种确定订货量的方法。我们不再采用较简单模型中的补货至某水平的策略,而是提出这样一个思路:订购足够满足明天预期需求的数量,并加以调整。我们可以将其写作
\[\begin{align} X^\pi(S_t\vert \theta) = \max\{0,f^D_{t,t+1}-R_t\} + \theta. \label{eq:adjustedforecastpolicy} \end{align}\]如果我们有完美的预测,那么我们所需订购的就只是$f^D_{t,t+1}$(我们对$\Dhat_{t+1}$的预测)减去现有库存。然而,由于存在不确定性,我们将添加一个调整项$\theta$,以便留有一定的缓冲以避免缺货。
步骤6. 评估策略——这一次我们必须对序列$W_1, W_2, \ldots, W_T$中所有随机变量生成样本。我们同样可以生成整个序列的$N$个样本,从而使用以下方式估计策略的表现
\[\Fbar^\pi(\theta) = \frac{1}{N} \sum_{n=1}^N \sum_{t=0}^T C(S_t,X^\pi(S_t\vert \theta),\Dhat^n_{t+1}).\]我们再次面临寻找$\theta$最佳值的问题,但我们将在后面讨论这一挑战。
通用建模框架
我们现在准备更详细地描述通用建模框架(UMF)的各个要素。我们注意到,UMF能够对任何序贯决策问题进行建模。随着各要素的展开,这一相当宽泛的论断将变得显而易见,因为我们只是将符号应用于序贯决策问题的一般表述之上。
UMF的五个要素
UMF由以下要素组成:
- 状态变量$S_t$。
- 决策变量$x_t$。
- 外源信息过程$W_t$。
- 状态转移模型$S^M(S_t,x_t,W_{t+1})$。
- 目标函数。
我们对这些要素作如下详细说明:
状态变量——系统在时间$t$的状态$S_t$包含了从时间$t$起对我们的系统建模所必需且充分的全部信息。更具体地说,这些信息包括:
- a) 在时间$t$做出决策所需的信息。
- b) 在时间$t$计算性能指标所需的信息。
- c) 未来计算(a)和(b)现在所需的任何信息。
$S_t$中有三种类型的信息:
- 物理状态$R_t$,捕捉诸如库存、人员、可用机器、设施、水、药品、能源和(各种形式的)资金等物理量。$R_t$还将包括客户对产品或服务的请求。在许多应用中,$R_t$描述了正在被管理的资源,而一个相当常见的错误就是将”状态”等同于”物理状态”。
- 信息状态$I_t$,包含正在使用的函数(如果存在选择)以及任何可调参数。$I_t$可能指定我们如何预测需求,以及用于拟合预测的参数,还包括控制系统演化的任何其他参数。
- 信念状态$B_t$,包含对未被完全知晓的量和参数的估计或信念。因此,$B_t$可以捕捉正态分布的估计均值和方差(如上文我们的需求预测中所示)。或者,它也可以是一个随时间演化的概率向量。
物理状态$R_t$可能是现金账户中的资金数额,而$I_t$可能是股票和债券市场的当前状态。如果我们在一个动态网络中出行,$R_t$可能是我们在网络中的位置,而$I_t$可能是我们对每条链路上出行时间的了解情况。如果我们制定了一个计划并希望对偏离计划的行为进行惩罚,那么该计划将通过$I_t$被包含在状态变量中。
状态变量通常不是显而易见的。它们是在建模过程中逐渐显现的,而不是你能够立即列出的东西。仅仅因为我们首先写出它,并不意味着你总能立即列出状态变量的所有元素。但最终,这就是你存储从时间$t$起对系统建模所需的所有信息的地方。
决策变量——不同的学术社区对决策使用不同的记号,比如工程学中用$a_t$表示(通常是离散的)动作,或用$u_t$表示(通常是连续的)控制。我们默认使用$x_t$,因为它被数学规划社区广泛采用。
决策变量有不同的类型:
- 二元的(例如用于建模是否出售资产,或用于不同网页设计的A/B测试)。
- 离散的(例如药物选择,选择推广哪种产品)。
- 连续标量(价格、温度、浓度)。
- 向量(离散或连续,例如血液供应在医院之间的分配)。
- 类别型的(例如产品广告中要突出哪些特征)。
我们注意到,存在由决策变量性质所决定的算法类别。
我们假设决策是通过策略做出的,如果我们用$x_t$作为决策,可以将该策略记为$X^\pi(S_t)$。我们假设决策$x_t = X^\pi(S_t)$在时间$t$是可行的,这意味着$x_t \in \Xcal_t$属于某个集合(或区域)$\Xcal_t$,该集合可能依赖于$S_t$。
我们让”$\pi$”携带关于函数类型$f\in\Fcal$(例如,具有特定解释变量的线性模型)以及任何可调参数$\theta \in \Theta^f$的信息。
外源信息——我们令$W_{t+1}$为在时间$t+1$首次变为已知的任何新信息(即在$t$和$t+1$之间),其中该信息的来源是我们系统之外的(这就是为什么称之为”外源的”)。在对特定变量建模时,我们用”帽子”符号来表示外源信息。因此,$\Dhat_{t+1}$可能是在$t$和$t+1$之间产生的需求,或者我们可以令$\phat_{t+1}$为$t$和$t+1$之间价格的变化。
外源信息过程可能是平稳的或非平稳的,可能是纯粹外源的,也可能依赖于状态(甚至可能依赖于行动)(如果我们决定抛售大量股票,可能会压低价格)。
我们令$\omega$表示一条样本路径$W_1, \ldots, W_T$,它代表每个$W_t$结果的一个序列。通常,我们会创建一个由离散样本组成的集合$\Omega$,其中每个样本代表我们$W_t$过程结果的一个特定序列,可以写作$W_1(\omega), \ldots, W_T(\omega)$。如果我们有20条样本路径,可以将$\omega$看作是1到20之间的一个数字,它使我们能够查找相应的样本路径。
转移函数——我们用以下方式表示转移函数
\[\begin{align} S_{t+1} = S^M(S_t,x_t,W_{t+1}), \label{eq:transition} \end{align}\]其中$S^M(\cdot)$也被称为状态转移模型、系统模型、被控对象模型、被控对象方程、状态方程和传递函数等名称。
方程$\eqref{eq:transition}$是转移函数的经典形式,它给出了从状态$S_t$到状态$S_{t+1}$的方程。方程$\eqref{eq:inventoryexampleequation}$是我们简单库存示例中唯一的转移方程,而方程$\eqref{eq:introcomplexinventorytransition1}$–$\eqref{eq:introcomplexinventorytransition6}$则构成了我们更复杂示例的转移函数。
转移函数可能捕捉以下任一类型的更新:
- 物理资源的变化,例如增加库存、调动人员或修改设备。
- 信息的更新,例如价格和天气的变化。
- 我们对不确定量或参数的信念的更新。
转移函数可能是一组已知的方程,也可能是未知的,例如当我们描述人类行为或大气中CO2的演变时。当方程未知时,该问题通常被描述为”无模型的”或”数据驱动的”,这意味着我们只能观察一个变量的变化,而不是使用一个物理模型。方程$\eqref{eq:introcomplexinventorytransition6}$是无模型转移的一个示例,在该方程中我们”观测”成本$c_{t+1} = \chat_{t+1}$,而完全不知道我们是如何从$c_t$演化而来的。
转移函数可能是线性的、连续非线性的或阶跃函数。当状态$S_t$包含信念状态$B_t$时,转移函数就必须包含更新方程(我们将在本书后面加以说明)。
给定一个策略$X^\pi(S_t)$、一个外源过程$W_{t+1}$和一个转移函数,我们可以将状态、决策和信息的序列写作
\[(S_0, x_0, W_1, S_1, x_1, W_2, \ldots, x_{T-1}, W_T, S_T).\]目标函数——书写目标函数的方式有多种。其中最常见的一种,我们将其作为默认方式,是在某个时域$t=0, \ldots, T$上最大化总期望贡献
\[\begin{align} \max_{\pi=(f,\theta)} F^\pi(S_0) = \E \left\{\sum_{t=0}^T C_t(S_t,X^\pi_t(S_t\vert \theta))\vert S_0\right\}, \label{eq:objectivecumulativereward} \end{align}\]其中
\[\begin{align} S_{t+1} = S^M(S_t,X^\pi_t(S_t),W_{t+1}). \label{eq:basetransition} \end{align}\]当我们同时拥有初始状态$S_0$的模型以及外源过程$W_1, W_2, \ldots$的模型时,该模型才算完全确定。我们将全部外源信息写作
\[\begin{align} (S_0, W_1, W_2, \ldots, W_T). \label{eq:basestochasticmodel} \end{align}\]方程$\eqref{eq:objectivecumulativereward}$、$\eqref{eq:basetransition}$和$\eqref{eq:basestochasticmodel}$共同构成了一个序贯决策问题的模型。
接下来,为了简洁起见,我们将使用$\max_\pi$来表示对函数类型$f\in\Fcal$和可调参数$\theta\in\Theta^f$的搜索。
方程$\eqref{eq:objectivecumulativereward}$使用了一个期望$\E$,这意味着要对$W_1, \ldots, W_T$所有可能结果取平均值。这在计算上几乎从来都是不可行的。相反,设$\omega$表示序列$W_1, \ldots, W_T$的单个结果,我们可以将其写作$W_1(\omega), \ldots, W_T(\omega)$。假设我们能够创建该序列的$N$个可能结果,并令$\omega^n$表示我们如何对第$n^{th}$个序列进行索引。
如果我们沿着一条样本路径 $\omega$ 进行,那么我们可以使用
\[\begin{align} S_{t+1}(\omega) = S^M(S_t(\omega),X^\pi_t(S_t(\omega)),W_{t+1}(\omega)). \label{eq:basetransition2} \end{align}\]将 $\eqref{eq:basetransition}$ 中的转移函数重新写出。
我们用 $\omega$ 对方程 $\eqref{eq:basetransition2}$ 中的每个变量进行索引,以表示我们正在沿着 $W_t$ 的单一样本路径的值进行计算。
现在我们可以用一个平均值来代替基于期望的目标函数,写作
\[\begin{align} \max_\pi \Fbar^\pi(S_0) = \frac{1}{N}\sum_{n=1}^N \sum_{t=0}^T C_t(S_t(\omega^n),X^\pi_t(S_t(\omega^n))). \label{eq:objectivecumulativerewardaverage} \end{align}\]通常,我们只处理单一的样本路径,可能来自历史数据。在这种情况下,我们是利用这条单一样本路径来近似策略的表现,可以写作
\[\begin{align} \max_\pi \Fhat^\pi(\omega\vert S_0) = \sum_{t=0}^T C_t(S_t(\omega),X^\pi_t(S_t(\omega))). \label{eq:objectivecumulativerewardsample} \end{align}\]任何时候我们用期望来书写目标函数,如 $\eqref{eq:objectivecumulativereward}$ 所示,请记住我们实际上应该使用像 $\eqref{eq:objectivecumulativerewardaverage}$ 那样的平均值,或者像 $\eqref{eq:objectivecumulativerewardsample}$ 那样的样本。
期望还可能需要反映初始状态 $S_0$ 中的不确定性,这可能是捕捉关于不确定预测的信念,或者关于患者疾病状态的不确定估计。在这种情况下,样本路径 $\omega$ 需要包括来自这些初始分布的样本。
在某些情境下,使用计数器 $n$ 而不是时间会更合理。在这种情况下,我们令 $S^n$ 为经过 $n$ 次观测后的状态(这些观测可能是实验、顾客到达,或算法的迭代)。我们将使用时间 $t$ 作为默认的索引。
初始状态变量 $S_0$
我们需要区分初始状态 $S_0$ 与 $t > 0$ 之后的状态 $S_t$:
- $S_0$ – 初始状态 $S_0$ 捕捉了 i) 永不改变的确定性参数,ii) 可能因决策而改变的数量或参数的初始值,以及 iii) 我们并不完全了解的数量或参数的信念(这可能是某个概率分布的参数),例如我们对疫苗的反应,或市场对价格的反应。这些信念可能保持静态,也可能随着我们从观测中学习而更新。
- $S_t$ – 这是在时间 $t$ 时,我们从历史中所需的全部信息,用以对时间 $t$ 之后的系统进行建模。$t > 0$ 时的 $S_t$ 只包括随时间变化的变量,这意味着在时间 $t$ 时,我们也可能在使用包含在 $S_0$ 中的静态信息。
无论我们使用的是 $F^\pi(S_0)$、$\Fbar^\pi(S_0)$ 还是 $\Fhat^\pi(\omega\vert S_0)$,我们都要明确写出策略表现对初始状态 $S_0$ 的依赖关系。虽然这一点应该是显而易见的,但却常常被忽视。初始状态包括如下要素:
- 物理或金融资源数量的初始值 $R_0$ – 这可能是初始库存、车辆的初始位置、可用机器,以及初始设施集合。它还包括任何静态数值,例如运输网络、仓库大小(不会改变),以及车队中的卡车数量。
- 参数的初始值,以及用于建模问题的任何函数 $I_0$ – 这可能是初始价格、患者体内的药物水平,以及用于执行预测或对人群疾病演变建模所选择的函数。
- 任何数量或参数的初始信念或估计 $B_0$ – 这可能是需求预测、市场对价格反应的估计、总统候选人的民调情况,或者对某个制造流程性能的信念。
需要注意的是,将永不改变的初始值与随时间演变的(无论是由于决策的直接结果,还是由于外源信息而演变)值分开会有所帮助。永不改变的值存储在 $S_0$ 中,但不在 $t > 0$ 时的 $S_t$ 中表示。这样做的原因是希望使 $S_t$ 尽可能保持紧凑。
假设我们的策略 $X^\pi(S_t\vert \theta)$ 具有可调参数。例如,我们可能正在管理一个库存系统,其中我们使用大家熟悉的”补货至某水平”策略(在库存文献中称为 $(s,S)$ 策略),其形式为
\[X^\pi(S_t\vert \theta) = \begin{cases} \theta^{max} - R_t & R_t < \theta^{min},\\ 0 & \text{otherwise.}\end{cases}\]其中 $\theta = (\theta^{min},\theta^{max})$。为简单起见,我们可以假设当我们下订单时会立即到货(这是教科书中的标准假设,但在实践中从未成立),这使我们能够用以下方式写出我们物理状态 $R_t$(即在下达即时订单之前的库存量)的演变:
\[R_{t+1} = \max\{0,R_t + x_t - \Dhat_{t+1}\}\]其中 $x_t = X^\pi(S_t\vert \theta)$,而 $\Dhat_{t+1}$ 是我们的产品在区间 $(t,t+1)$ 上的需求(这是我们的外源信息 $W_{t+1}$)。最后,令 $C(S_t,x_t,W_{t+1})$ 为我们在区间 $(t,t+1)$ 上的净利润(这暂时并不重要)。
现在设想我们拥有一个历史需求过程 $W_1, W_2, \ldots, W_t, \ldots, W_T$,这使我们能够对系统进行仿真。令 $\omega$ 表示这一历史需求序列(或任何外源信息)。我们可以用以下方式写出寻找最优订购参数集 $\theta$ 的问题:
\[\begin{align} \max_\theta \Fhat^\pi(\omega,\theta\vert S_0) = \sum_{t=0}^T C_t(S_t(\omega),X^\pi_t(S_t(\omega))), \label{eq:optimizingtheta} \end{align}\]其中状态变量按以下方式演变
\[S_{t+1}(\omega) = S^M(S_t(\omega), X^\pi_t(S_t(\omega)), W_{t+1}(\omega)).\]令 $\theta^\ast $ 为我们通过优化 $\eqref{eq:optimizingtheta}$ 所找到的 $\theta$ 的值。书写这一最优值的恰当方式是将其作为依赖于 $S_0$ 中信息的函数 $\theta^\ast (S_0)$(它也依赖于样本路径 $\omega$)。这有助于传达这样一个现实:如果我们改变问题的输入数据,即由 $S_0$ 表示的数据,那么这可能会影响我们策略参数 $\theta$ 的最佳值。事实上,我们甚至可能不得不改变策略的选择!
变体
我们的基本数学模型有两个重要变体:
-
从时间 $t$ 到迭代 $n$ – 在某些问题情境中,使用计数器 $n$ 比使用时间 $t$ 更自然。我们所做的不仅仅是将 $t$ 改为 $n$,因为我们将随迭代变化的变量与随时间演变的变量区别对待。具体来说,我们将索引 $n$ 放在上标位置,例如 $S^n$、$x^n$ 和 $W^{n+1}$。
之所以这样做,原因之一是我们将时间 $x_1, x_2, \ldots, x_t, \ldots, x_T$ 上的一组变量视为一个向量 $x=(x_1, x_2, \ldots, x_t, \ldots, x_T)$,这在对确定性问题建模时很有用(我们可能要对整个向量 $x$ 一次性进行优化)。相比之下,我们将 $x^n$ 视为随时间演变的函数。
更实际的是,将 $n$ 放在上标位置使我们能够写出迭代仿真。这样,我们就可以用以下方式写出迭代 $n$ 中随时间变化的信息过程:
如果我们正在迭代地搜索最优策略,我们可以用 $X^{\pi,n}(S_t)$ 来表示迭代 $n$ 中的策略,这样就产生了
\[S^n_0, x^n_0, W^n_1, \ldots, S^n_t, x^n_t, W^N_{t+1}, \ldots, S^N_T,\]其中 $x^n_t = X^{\pi,n}(S^n_t\vert \theta)$。
-
优化最终奖励 – 一种常见的情境是我们正在进行随机搜索,就像寻找最优策略时那样。评估算法的每一次迭代可能需要在时间上进行一次仿真,尽管这并不总是如此。
现在假设我们的决策变量是参数 $\theta$,并且我们有一个算法 $\Theta^\pi(S^{\theta,n})$,其运作方式与策略 $X^\pi(S_t\vert \theta)$ 类似,只不过 $S^{\theta,n}$ 捕捉的是算法在第 $n$ 次迭代时的”状态”。
搜索算法都是序贯决策问题,但与大多数随时间演变的序贯决策问题不同,我们希望运行 $N$ 次迭代,并且我们只关心最终的解。令 $\theta^{\pi,N}$ 为在遵循”算法”(策略)$\pi$ 经过 $N$ 次迭代后 $\theta^n$ 的值。
值 $\theta^{\pi,N}$ 依赖于我们信息过程 $W^1, \ldots, W^t, \ldots, W^N$ 的具体序列,但随后我们必须使用一组我们称之为 $\What$ 的新样本对其进行评估。
我们使用最终奖励目标函数来评估算法的性能,写作
简单来说,我们通过使用 $W^n$ 的观测值(这可能是随时间 $t$ 进行的整个仿真)对我们标记为 $\Theta^\pi(S^{\theta,N})$ 的学习策略进行 $N$ 次迭代仿真来评估其在 $\theta$ 情况下的表现。当我们得到参数 $\theta$ 的最终估计值,我们称之为 $\theta^{\pi,N}$ 时,我们通过一个独立的仿真来评估这个值的性能,在该仿真中我们固定 $\theta = \theta^{\pi,N}$,然后创建一组我们称为 $m=1, \ldots, M$ 的 $\What^m$ 的新随机观测值。
不确定性建模
对于许多复杂问题(供应链、能源系统和公共卫生仅是其中几例),识别和建模不同形式的不确定性可能是一项丰富而复杂的工作。我们将对可能出现的问题略作提示,但不会尝试对这一维度进行详尽的讨论。
不确定性通过两种机制传达给我们的模型:初始状态 $S_0$(我们会在其中对描述我们不完全了解的数量和参数的概率分布的参数进行建模),以及外源信息过程 $W_1, \ldots, W_T$。
初始状态中的不确定性
初始状态变量可能包含确定性参数,或动态变化的数量和参数的初始值。如果初始状态中只包含这些内容,那么它并未捕捉任何形式的不确定性。
有许多问题中,我们并不知道某些数量或参数,但可以通过一个概率分布的参数来表示我们已知的信息。一些例子包括:
- 患者对新药物的反应。
- 市场对价格变化的反应。
- 我们库存中可销售的生菜头数(可能有不确定数量的生菜已经枯萎,不再可销售)。
- 先前从中国订购的一箱库存到达的时间。
- 对共同基金的存款金额围绕均值 $\lambda$ 随机变化,但我们不知道 $\lambda$ 是多少。
这些是我们可以用来在某些输入中初始化含有不确定性的模型的若干方式。
初始的概率信念可能来自主观判断,也可能来自先前的观测或实验。
外源信息过程
不确定性进入我们模型的第二种方式是通过外源信息过程。变量 $W_t$ 包含直到时间段 $t$ 才为人所知的信息。这意味着我们必须在时间 $t$ 做出决策 $x_t$,而此时我们尚不知道 $W_{t+1}$ 的结果。
以下是在做出决策 $x_t$ 之后才被揭示的 $W_{t+1}$ 的一些示例:
- 我们选择一条路径,然后观察该路径上的行程时间。
- 我们选择一种药物,然后观察患者的反应。
- 我们选择一种催化剂,然后观察它所生成材料的强度。
- 我们选择在在线市场中推广某个产品,然后观察其销量。
- 我们选择一种网页界面设计,然后观察它所能产生的点击量。
- 我们将资金投入某项投资,然后观察该投资价格的变化。
在每种情况下,我们在做出决策之后所观察到的信息都会影响该决策的表现(以及原本哪个决策才是最优的)。
读者现在可能已经意识到,$W_{t+1}$ 通常是不同类型信息的集合。举例来说,设想我们正在治疗一位血糖偏高的患者。医生希望尝试不同的策略,从饮食和运动,到用于减肥的药物,再到专门针对血糖的药物。医生需要处理的信息来源可能包括:
- 患者接受饮食控制的意愿。
- 患者对饮食指导的依从性。
- 患者接受每日减肥注射的意愿。
- 实际的减重情况(来自任何方案)。
- 血糖的实际变化。
这些都是各自独立的信息流。我们可以通过引入集合 $\Ical_t$(时间 $t$ 时的信息过程集合)来对这些进行建模(该集合可能会随着我们改变策略而变化,从而开启新的信息流)。现在我们可以使用 $W_{t+1,i}$ 来表达不同类型的信息,即来自信息源 $i\in\Ical_t$ 的信息实现,从而有 $W_{t+1} = (W_{t+1,i})_{i\in\Ical_t}$。
我们将继续使用 $W_{t+1}$ 来表示新到达的信息,但读者必须记住,在实际应用中,这通常会包括一整套信息来源,每种都有各自的行为特性。
状态/决策依赖过程
在许多应用中,信息 $W_{t+1}$ 依赖于当前状态 $S_t$ 和/或决策 $x_t$。一些例子包括:
- 库存不足可能会使顾客望而却步,从而降低需求。
- 大量买入股票可能会推高股价。
- 建议接种疫苗的决策可能会影响疾病的演变进程。
- 在线运行的发电机数量会改变电网价格。
正因如此,将外源信息表示为函数$W_{t+1}(S_t,x_t)$会很有帮助,这个外源信息函数给出了在区间$(t,t+1)$内到达的信息。
例如,设想我们正在大量买入或卖出某只股票,这可能会影响未来的价格。其动态过程可以写成
\[\begin{align} p_{t+1} = \theta^p_0 p_t + \theta^p_1 p_{t-1} + \theta^p_2 p_{t-2} + W_{t+1}(S_t,x_t). \label{eq:statedependentprice} \end{align}\]这个价格过程的状态可以写成
\[S_t = (p_t, p_{t-1}, p_{t-2}).\]由$W_{t+1}(S_t,x_t)$给出的价格随机变化,反映了我们的一种信念:价格变化可能取决于当前价格(如果价格已经很高,未来的变化很可能是负的),也取决于我们买入($x_t > 0$)或卖出($x_t < 0$)的数量。
当然,我们希望利用历史数据,尝试将$S_t$和$x_t$对未来价格的结构性影响,与真正的外源噪声区分开来。因此,我们可以提出这样一个模型
\[W_{t+1}(S_t,x_t) = \theta^x x_t + \varepsilon_{t+1},\]其中我们可以假设
\[\varepsilon_{t+1} \sim N(0, \vert x_t\vert \sigma^2_t),\]这个模型假设$\varepsilon_{t+1}$的均值为0,方差随$x_t$绝对值的增大而增大。那么信息$W_{t+1}(S_t,x_t)$的均值就是$\theta^x x_t$,如果我们是在买入股份($x_t > 0$),这个值为正;如果我们是在向市场卖出($x_t < 0$),则为负。
本书将继续使用$W_{t+1}$作为默认记号,但读者应当意识到,它可能依赖于当前状态和/或在给定状态下所做的决策。
不确定性的形态
识别信息的类型是理解不确定性的第一步。下一步是刻画不确定性的不同形态。以下总结了信息过程可能呈现行为方式中一些最重要的类型:
- 细粒度变异性——这可能出现在秒级(甚至更细的时间尺度)、分钟级、小时级或日级的时间尺度上。
- 转移——一个过程的细粒度变异性通常表现为围绕均值的波动,但有时均值会周期性地转移到一个新的水平。这可能反映了新技术、竞争对手的调整,或经济状况的变化。
- 突发与间歇性需求——疾病的传播可能造成感染激增,因为疫情爆发可能在局部地区扩散。一名顾客可能拿起一件产品并推荐给朋友,朋友再告诉他们自己的朋友。
- 尖峰——即将来临的暴风雪可能导致对牛奶、鸡蛋和卫生纸需求的骤增;一台发电机的故障可能导致电价出现尖峰。
- 空间性事件——天气、疾病以及监管变化都可能造成具有区域性质的随机变化。
- 系统性事件——这些事件可能影响整个公司(跨越国界)、整个国家,甚至产生全球性影响。这可能源于对通信系统的网络攻击、公众认知的变化,以及负面宣传。
- 罕见事件——罕见事件可能源自多种来源,如地震、疾病爆发或恐怖袭击。这类事件往往发生频率很低,但一旦发生,可能会对组织造成重大影响。
- 应急情形——这一类别指的是那些可能发生、但没有历史先例的事件。例如,电网运营商会为核电站的故障做规划。尽管这种情况在某个国家可能从未发生过,电网运营商仍然可能希望为其一旦发生做好准备。
这些行为会对决策制定所选用的策略产生影响,这是我们接下来要讨论的主题。
不确定性被广泛认为是企业、组织乃至政府都必须为之规划的一个问题。人们常常忽略的一点是,建模不确定性的目的在于理解它是如何影响决策的。不确定性总是与未来到达的信息过程相关联,因此我们必须思考现在做出的决策会如何受到这一未来信息的影响。
设计策略
策略是做出决策的一种方法……任何方法都可以。
策略是利用状态变量中的信息来做出决策的函数。这听起来像是一个定义明确的问题;毕竟,机器学习界完全是围绕着寻找与训练数据集相匹配的函数这一挑战而建立起来的。然而,设计策略要丰富得多,这一点从活跃于该领域的众多学科的多样性中可见一斑。
图 1.2 展示了约15个不同领域的代表性书籍封面,这些领域都涉及不确定性下的序贯决策。它们使用了八种不同的记号体系,在建模方式上也采用了根本不同的方法。有些甚至把策略(涉及内嵌的优化问题)与目标函数相混淆。
策略绩效指标
确定性优化的特征在于存在一个目标函数,用以判断某个决策是否优于另一个决策。而对于序贯决策问题,我们通常会有一个目标函数,用来评估策略的表现,就像我们在方程$\eqref{eq:objectivecumulativereward}$、$\eqref{eq:objectivecumulativerewardaverage}$和$\eqref{eq:objectivecumulativerewardsample}$中所做的那样。
然而在实践中,策略的选择是基于若干相互竞争的准则:
- 解的质量——我们通常关注的是在一段时期内的表现(例如成本、利润、健康结果),如方程$\eqref{eq:objectivecumulativerewardsample}$的抽样版本目标所表达的那样。由于这是随机的,我们必须同时考虑平均表现和最坏情形表现。
- 计算需求——在实际运行环境中,运行时间至关重要。与目标函数一样,计算一个策略所需的时间也是随机的,因此我们需要同时考虑平均执行时间和最坏情形执行时间。
- 透明性——将某个决策追溯回输入数据(其中可能存在误差)的难易程度。
- 灵活性/适应性——现实世界的问题可能非常复杂,我们常常必须适应复杂的局面。
- 方法复杂度——如果某个策略是由内部的分析团队(举例而言)来实施,他们就必须考虑其能否让该方法真正行之有效的可能性。
- 数据需求——不同的策略有不同的数据需求。
图1.2 中所展示的数学优化界可能会谈论最优策略,这意味着要对方程$\eqref{eq:objectivecumulativereward}$中的期望进行优化。然而,重要的是要关注上述所有这些特性。
四类策略
图1.2中的这些书籍展示了随时间做出决策的各种方式。事实证明,它们都可以划分为定义明确的策略类别。创建策略有两种基本策略方式,每一种又可以进一步划分为两类,从而形成四类策略:
策略搜索——即在各种做决策的方法(函数)中进行搜索,模拟它们的表现(如我们在方程$\eqref{eq:objectivecumulativereward}$中所做的那样),从而找出长期平均表现最佳的方法。这可能涉及在不同类别的方法之间进行搜索,也可能涉及对某个给定方法的可调参数进行搜索。这一思路开启了两类策略:
- 1)策略函数近似(PFAs)——这些是状态的解析函数,直接给出一个行动。方程$\eqref{eq:introorderupto}$中的补货至目标水平策略就是一个很好的例子,此外还有我们在方程$\eqref{eq:adjustedforecastpolicy}$中使用调整后预测的策略。
- 2)成本函数近似(CFAs)——这些策略涉及求解一个优化问题,该问题通常是对原问题的简化,并引入参数以帮助策略随时间推移表现得更好。这是一个特别强大的思想,在工业界被广泛使用。本书后续将有多处关于CFA的示例(从第4章开始,学习糖尿病的最佳用药方案)。
前瞻策略——我们可以通过在决策的贡献(或成本)之上,加上当前所做决策所导致的下游贡献(或成本)的近似值,并对二者之和进行优化,从而构建有效的策略。同样,我们可以将其进一步划分为两类策略:
- 3)值函数近似(VFAs)——设想我们正在遍历图1.3所描绘的一个网络,我们希望找到从节点1到节点11的一条路径。现在设想我们位于节点$S_t = i = 2$,其中$t$记录了我们已经经过的链路数目。设$V_{t+1}(S_{t+1})$为从节点$S_{t+1}$(比如节点4或5)到节点11这条路径的值(假设我们是在做最大化;先不用担心我们是如何得到$V_{t+1}(S_{t+1})$的)。设决策$x_t$为我们从节点$S_t = i$出发所经过的链路。那么位于节点$S_t$的值将由下式给出
方程$\eqref{eq:bellmangraph}$被称为贝尔曼方程。当它被用于在如图1.3所描绘的确定性网络中寻找最佳路径时,是相当容易直观理解的。
在许多问题中,从状态$S_t$到$S_{t+1}$的转移涉及在时间$t$尚未知晓的随机信息。我们在第一个库存问题中见过一个简单的随机性例子,在第二个库存问题中则见过一个更复杂的例子。
对于这些更一般的问题,如果我们处在状态$S_t$,做出决策$x_t$,随后观察到新信息$W_{t+1}$(这在时间$t$是未知的),它将根据我们的转移函数把我们带到一个新的状态$S_{t+1}$
\[S_{t+1} = S^M(S_t,x_t,W_{t+1}).\]这意味着在时间$t$,当我们必须选择$x_t$时,$W_{t+1}$是一个随机变量,这也就意味着$S_{t+1}$同样是一个随机变量。在这种情况下,我们必须在贝尔曼方程中插入一个期望,将方程$\eqref{eq:bellmangraph}$写成
\[\begin{align} V_t(S_t) = \max_{x_t} \big(C(S_t,x_t) + \E_{W_{t+1}} \left\{V_{t+1}(S_{t+1})\vert S_t,x_t\right\}\big). \label{eq:bellmanstochastic} \end{align}\]这里我们插入了期望$\E_{W_{t+1}}\lbrace \cdot\rbrace $,它的字面含义就是对$W_{t+1}$的所有随机结果取平均。
$\eqref{eq:bellmanstochastic}$中随机版本的贝尔曼方程是极其一般化的。状态$S_t$不仅仅指图中的一个节点;它捕捉了与该问题相关的任何(以及所有)信息。困难在于,我们不再能够计算值函数$V_t(S_t)$,这反过来意味着我们将无法获得我们在方程$\eqref{eq:bellmangraph}$和$\eqref{eq:bellmanstochastic}$中假设已知的$V_{t+1}(S_{t+1})$。
研究界在尝试应用贝尔曼方程时所采用的策略,是借鉴机器学习领域,估计一个统计近似,我们将其称为$\Vbar_t(S_t)$。假设我们能够得出一个合理的近似$\Vbar_{t+1}(S_{t+1})$,我们就可以用下式来写出我们的策略(我们做出决策的方法)
\[\begin{align} X^\pi(S_t) = \argmax_{x_t\in\Xcal_t} \big(C(S_t,x_t) + \E_{W_{t+1}} \{\Vbar_{t+1}(S_{t+1})\vert S_t,x_t\}\big). \label{eq:introvbarpolicy} \end{align}\]记号”$\argmax_x f(x)$”表示使函数$f(x)$取最大值的$x$的值。下标$\pi$携带的信息指明了函数$f$的结构,以及我们在近似$\Vbar_{t+1}(S_{t+1})$中所需要的任何可调参数$\theta$。
这类策略归属于诸如近似动态规划、以及最常见的强化学习这样的标题之下。虽然这是一个强大的思想,但它并不容易应用,其成效取决于我们创建出精确近似$\Vbar_{t+1}(S_{t+1})$的能力。
关于逼近值函数的方法,已有非常丰富的文献,但它并非万能药。本书将在若干地方阐述这一思想,但要提醒读者,这类策略相当难以使用。
-
4)直接前瞻近似(DLA) —— 有许多问题,我们根本无法利用前三类方法中的任何一种来设计出有效的策略,此时我们就必须转向直接前瞻近似。稍后我们会以完整的数学形式写出这一方法,但目前,我们将DLA描述为:在对一个(通常是近似的)模型进行优化的同时,在当前做出决策,而该模型延伸至某个规划时域。
一种常见的DLA做法是构建一个确定性的近似模型。当我们使用导航系统来寻找到达目的地的最短路径,并假设我们已知网络中每条路段上的行驶时间时,我们所做的正是这件事。一般而言,对未来求解一个精确的随机模型几乎总是不可能的,因此我们将研究不同的策略来对该问题进行近似处理。
我们用两个库存问题来说明我们的建模框架,并通过方程$\eqref{eq:introorderupto}$和$\eqref{eq:adjustedforecastpolicy}$提出了两种简单的策略(PFA的形式),但这样做只是为了给出一个具体的策略示例。尽管PFA在日常决策中被广泛使用,但这些都只是专门化的例子。
相比之下,我们要说明的是,我们刚才概述的四类策略(PFA、CFA、VFA和DLA)是通用的,也就是说,它们涵盖了我们可能用来求解任何序贯决策问题的任何方法。需要明确的是,这些是元类别。也就是说,即使我们认为某个问题适合归入某一特定类别,我们的工作也并未完成,因为我们仍然需要在该类别内设计出具体的策略。尽管如此,我们认为这四类策略为设计策略的过程提供了一份路线图。
策略的检验
要检验一个策略的价值,我们将使用方程$\eqref{eq:objectivecumulativerewardsample}$,该方程在信息过程$W_t$的单一样本路径上对策略进行模拟。在模拟策略时,最困难的部分通常是构建外源信息过程。
设$\omega$为一条样本路径,其中$W_1(\omega), \ldots, W_T(\omega)$表示某一特定的样本路径。表1.3展示了10条价格样本路径,索引从$\omega^1$到$\omega^{10}$。若我们选择$\omega^6$,则$W_7(\omega^6) = 44.16$。
| $t=1$ | $t=2$ | $t=3$ | $t=4$ | $t=5$ | $t=6$ | $t=7$ | $t=8$ | |
|---|---|---|---|---|---|---|---|---|
| $\omega^n$ | $p_1$ | $p_2$ | $p_3$ | $p_4$ | $p_5$ | $p_6$ | $p_7$ | $p_8$ |
| $\omega^1$ | 45.00 | 45.53 | 47.07 | 47.56 | 47.80 | 48.43 | 46.93 | 46.57 |
| $\omega^2$ | 45.00 | 43.15 | 42.51 | 40.51 | 41.50 | 41.00 | 39.16 | 41.11 |
| $\omega^3$ | 45.00 | 45.16 | 45.37 | 44.30 | 45.35 | 47.23 | 47.35 | 46.30 |
| $\omega^4$ | 45.00 | 45.67 | 46.18 | 46.22 | 45.69 | 44.24 | 43.77 | 43.57 |
| $\omega^5$ | 45.00 | 46.32 | 46.14 | 46.53 | 44.84 | 45.17 | 44.92 | 46.09 |
| $\omega^6$ | 45.00 | 44.70 | 43.05 | 43.77 | 42.61 | 44.32 | 44.16 | 45.29 |
| $\omega^7$ | 45.00 | 43.67 | 43.14 | 44.78 | 43.12 | 42.36 | 41.60 | 40.83 |
| $\omega^8$ | 45.00 | 44.98 | 44.53 | 45.42 | 46.43 | 47.67 | 47.68 | 49.03 |
| $\omega^9$ | 45.00 | 44.57 | 45.99 | 47.38 | 45.51 | 46.27 | 46.02 | 45.09 |
| $\omega^{10}$ | 45.00 | 45.01 | 46.73 | 46.08 | 47.40 | 49.14 | 49.03 | 48.74 |
表1.3。 一组价格样本路径的示意,所有路径均从$45.00开始。
问题是:我们该如何生成如表1.3所示的一组观测样本?通常有三种策略:
- 根据历史数据创建样本。由于在任一时间点只有一个结果,我们可以通过组合不同时间段的观测值来创建多条样本路径。我们可以选取不同年份的价格,或不同月份的需求,或不同日期观测到的行驶时间。当外源信息依赖于状态$S_t$或决策$x_t$时,这种方法就不可行了。
- 通过数学模型进行模拟。这种方法的优势在于能够生成大量样本,从而得到策略性能的统计上可靠的估计。这类模型可以做得非常精细,但即便是精细的模型,也很容易创建出无法复现真实数据行为的模型。最大的挑战在于捕捉相关性,无论是时间上的相关性,还是样本之间的相关性(比如不同产品的需求之间、不同股票的价格之间,或不同地点的风速之间)。
- 我们可以在实地测试某个想法,使用实际发生的观测值。这样做的好处是我们使用的是真实数据(历史未必与未来相同)。缺点是获得一天的新数据需要花费一天的时间(而我们可能需要远超一天的观测数据)。
如果$W_{t+1}$依赖于状态$S_t$和/或决策$x_t$,那么我们就必须设计出一种方法来体现这种依赖关系。构建数学模型使得在计算机中执行大量模拟成为可能,但生成信息过程的样本同样需要重现跨时间以及跨空间的相关性。关于不确定性建模的更深入讨论,我们建议读者参阅RLSO第10章。
下一步
本书接下来的五章将把我们的建模框架应用到五个不同的问题上:
这些章节中的每一章都将遵循我们上面用来描述两个库存问题时所采用的相同大纲。该大纲包括:
- 叙述 —— 用通俗英语对问题进行描述。
- 通用模型 —— 该模型将遵循我们的格式,描述序贯决策问题的五个要素:状态变量、决策变量、外源信息变量、转移函数以及目标函数。
- 不确定性模型 —— 在这里,我们将针对问题中的各种不确定性提出一个可能的模型。
- 设计策略 —— 我们将针对如何做出决策提出可能的策略。我们精心选择了这些问题,以使这五个应用场景能够带领我们游历所有四类策略。就目前而言,我们将让读者自行尝试辨认我们所选择的属于四类中的哪一类。
- 扩展 —— 最后,我们可能会针对基本问题提出一个或多个可能的扩展,这些扩展或许需要改变策略。
随后,我们将在第7章中回归到四类策略,讨论我们的通用建模框架,并利用第2至6章中的问题来说明不同的建模思路。
在这部分讨论之后,我们将回归到以举例教学为模式的章节,但所使用的问题会更加复杂。我们剩余的章节涵盖以下问题:
- 第8章 —— 储能I
- 第9章 —— 储能II
- 第10章 —— 供应链管理I:双主体新闻小贩问题
- 第11章 —— 供应链管理II:啤酒游戏
- 第12章 —— 广告点击优化
- 第13章 —— 血液管理问题
- 第14章 —— 临床试验优化
我们学到了什么?
- 首先,我们了解了什么是决策!
- 我们介绍了一个通用模型,称为通用建模框架,适用于任何序贯决策问题。
- 我们首先使用一个经典的库存问题来说明该模型,其中系统的状态即为库存量。
- 随后,我们过渡到一个稍微复杂一些的库存问题,其中状态变量包括库存的资源状态$R_t$、以价格$p_t$形式呈现的信息状态变量,以及最终以估计的均值和方差形式呈现的、关于即将到来的需求$\Dhat_{t+1}$的信念状态。
- 我们学习了如何对可能来自若干不同来源的外源信息流进行建模。外源信息被表示为一个可能依赖于状态和/或决策的函数。
- 我们说明了一种简单策略类别——策略函数近似(即PFA)——的两种形式。
- 我们了解到,策略可以根据具体情境以及决策的使用方式,通过多种不同的方法进行评估。
- 最后,我们简要概述了四类策略。这四类策略的示例将在第2至6章中给出,届时我们会在第7章暂停下来,对各类策略进行更深入的讨论,为第8至14章中更复杂的问题铺平道路。
习题
复习题
- 序贯决策问题数学模型的五个要素是什么?
- 对于$t > 0$,初始状态$S_0$中的变量与动态状态$S_t$中的变量有何区别?
- 决策与外源信息之间有何区别?
- 策略的两大类别是什么,它们之间有何不同?
- 比较简单库存问题与更复杂库存问题的状态变量。
问题求解题
- 就两个库存问题的策略如何应对与时间相关的行为进行比较。例如,我们的比萨店在周末的需求可能远高于工作日。请就使可调参数$\theta$随时间(或随星期几)变化,这一做法对改进解可能产生的价值发表评论。
- 对比一下你会如何针对以下两种情形,为库存问题调优参数$\theta$:
- 在模拟器中。
- 在实地环境中。