第四章 动态规划(写了一半)

引言

例如短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动 态规划方法比用其它方法求解更为方便。
虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时 间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为 多阶段决策过程,也可以用动态规划方法方便地求解。

例1 最短路线问题

在这里插入图片描述

例2 生产计划问题

在这里插入图片描述

1.2决策过程的分类

根据过程的时间变量是离散的还是连续的,分为离散时间决策过程连续时间决策过程;根据过程的 演变是确定的还是随机的,分为确定性决策过程随机性决策过程,其中应用广的是确定性多阶段决策过程。

2 基本概念、基本方程和计算方法

2.1 动态规划的基本概念和基本方程

一个多阶段决策过程优化问题的动态规划模型通常包含以下要素。

2.2.1阶段

阶段是对整个过程的自然划分。通常根据时间顺序或空间顺序特征来分阶段,以便按阶段的次序解优化问题。
阶段变量一般用k=1,2,…,n表示。在例1中由A出发为k=1,由Bi(i=1,2)出发为k=2,依次下去从Fi(i=1,2)出发为k=6,共n=6个阶段。在例2中按照第一、二、三、四季度分为k=1,2,3,4,共四个阶段。

2.1.2状态

状态(state)表示每个阶段开始时过程所处的自然状况。它应能描述过程特征并且无后效性,即当某阶段的状态变量给定时,这个阶段以后过程的演变与该阶段以前各阶段的状态无关。通常还要求状态是直接或间接可以观测的。
描述状态的变量称状态变量。变量允许取值的范围称允许状态集合。用 x k x_k xk表示第k阶段的状态变量,它可以是一个数或一个向量。用 X k X_k Xk表示第k阶段允许的状态集合。
在例1中 x 2 x_2 x2可取B1,B2,或将Bi定义为i(i=1,2),则x2=1或2,而X2={1,2}。

n个阶段的决策过程有n+1个状态变量,xn+1表示xn演变的结果。在例1中x7=1。
根据过程演变的具体情况,状态变量可以是离散的或连续的。为了计算的方便有时将连续变量离散化;为了分析的方便有时又将离散变量视为连续的。
状态变量简称为状态。

2.1.3 决策

当一个阶段的状态确定后,可以作出各种选择而演变到下一阶段的某个状态,这种选择手段称为决策,在最优控制问题中也称为控制。

描述决策的变量称为决策变量,变量允许取值的范围称允许决策集合。
用 u k ( x k ) 表 示 第 k 个 阶 段 处 于 状 态 x k 时 的 决 策 变 量 , 它 是 x k 的 函 数 , 用 U k ( x k ) 表 示 x k 的 允 许 决 策 集 合 。 在 例 1 中 u 2 ( B 1 ) 可 取 C 1 , C 2 或 C 3 , 可 记 作 u 2 ( 1 ) = 1 , 2 , 3 , 而 U 2 ( 1 ) = { 1 , 2 , 3 } 用u_k(x_k)表示第k个阶段处于状态x_k时的决策变量,它是x_k的函数,用U_k(x_k)表示x_k的允许决策集合。在例1中u_2(B_1)可取C_1,C_2或C_3,可记作u_2(1)=1,2,3,而U_2(1)=\{1,2,3\} uk(xk)kxkxkUk(xk)xk1u2(B1)C1,C2C3,u2(1)=1,2,3,U2(1)={1,2,3}
决策变量简称决策。

2.1.4 策略

决 策 组 成 的 序 列 称 为 策 略 。 由 初 始 状 态 x 1 开 始 的 全 过 程 的 策 略 记 作 p 1 n ( x 1 ) 即 决策组成的序列称为策略。由初始状态x_1开始的全过程的策略记作p_{1n}(x_1)即 x1p1n(x1)
p 1 n ( x 1 ) = { u 1 ( x 1 ) , u 2 ( x 2 ) , . . . , u n ( x n ) } p_{1n}(x_1)=\{u_1(x_1),u_2(x_2),...,u_n(x_n)\} p1n(x1)={u1(x1),u2(x2),...,un(xn)}
由 第 k 个 阶 段 的 状 态 x k 开 始 到 终 止 状 态 的 后 部 子 过 程 策 略 记 作 p k n ( x k ) , 即 由第k个阶段的状态x_k开始到终止状态的后部子过程策略记作p_{kn}(x_k),即 kxkpkn(xk),
p k n = { u k ( x k ) , . . . , u n ( x n ) } p_{kn}=\{u_k(x_k),...,u_n(x_n)\} pkn={uk(xk),...,un(xn)}
类 似 地 , 由 第 k 到 第 j 阶 段 的 子 过 程 的 策 略 记 作 类似地,由第k到第j阶段的子过程的策略记作 kj
p k j ( x k ) = { u k ( x k ) , . . . , u j ( x j ) } p_{kj}(x_k)=\{u_k(x_k),...,u_j(x_j)\} pkj(xk)={uk(xk),...,uj(xj)}
可供选择的策略有一定发范围,称为允许策略集合,用P1n(x1),Pkn(xk),Pkj(xk)表示。

2.1.5 状态转移方程

在确定性过程中,一旦某阶段的状态和决策为已知,下阶段的状态便完全确定。用状态转移方程表示这种演变规律,写作
在这里插入图片描述

2.1.6指标函数和最优值函数

指标函数是衡量过程优劣的数量指标,它是定义在全过程和所有后部子过程上的数量函数,用Vk,n(xk,uk,xk+1,…,xn+1)表示,k=1,2,…,n。指标函数应具有可分离性,即Vk,n可表示为xk,uk,Vk+1,n的函数,记为
V k , n ( x k , u k , x k + 1 , . . . , x x + 1 ) = φ k ( x k , u k , V k + 1 , n ( x k + 1 , u k + 1 , . . . , x n + 1 ) ) V_{k,n}(x_k,u_k,x_{k+1},...,x_{x+1})=φ_k(x_k,u_k,V_{k+1,n}(x_{k+1},u_{k+1},...,x_{n+1})) Vk,n(xk,uk,xk+1,...,xx+1)=φk(xk,uk,Vk+1,n(xk+1,uk+1,...,xn+1))

并且函数φk对变量Vk+1,n是严格单调的。
在这里插入图片描述根据状态转移方程指标函数Vk,n还可以表示为状态xk和策略pkn的函数,即Vk,n(xk,pkn)。在xk给定时指标函数Vk,n对pkn的最优值称为最优函数。记为fk(xk),即
在这里插入图片描述

2.1.7最优策略和最优轨线

在这里插入图片描述

2.1.8递归方程

在这里插入图片描述

model: 
Title Dynamic Programming; 
sets: vertex/A,B1,B2,C1,C2,C3,C4,D1,D2,D3,E1,E2,E3,F1,F2,G/:L; 
road(vertex,vertex)/A B1,A B2,B1 C1,B1 C2,B1 C3,B2 C2,B2 C3,B2 C4,
 C1 D1,C1 D2,C2 D1,C2 D2,C3 D2,C3 D3,C4 D2,C4 D3, 
D1 E1,D1 E2,D2 E2,D2 E3,D3 E2,D3 E3,
 E1 F1,E1 F2,E2 F1,E2 F2,E3 F1,E3 F2,F1 G,F2 G/:D; 
endsets
data: 
D=5 3 1 3 6 8 7 6
 6 8 3 5 3 3 8 4
 2 2 1 2 3 3 
 3 5 5 2 6 6 4 3; 
L=0,,,,,,,,,,,,,,,; 
enddata 
@for(vertex(i)|i#GT#1:L(i)=@min(road(j,i):L(j)+D(j,i))); 
end 

纵上所述,如果一个问题能用动态规划方法求解,那么,我们可以按下列步骤,首 先建立起动态规划的数学模型:

  1. 将过程划分成恰当的阶段。
  2. 正确选择状态变量 x k x_k xk,使它既能描述过程的状态,又满足无后效性,同时确定允许状态集合 X k X_k Xk
  3. 选择决策变量 u k u_k uk,确定允许决策集合 U k ( x k ) U_k(x_k) Uk(xk)
  4. 写出状态转移方程。
  5. 确定阶段指标 v k ( x k , u k ) v_k(x_k,u_k) vk(xk,uk)及指标函数 V k n V_{kn} Vkn的形式(阶段指标之和,阶段指标之积,阶段指标之极大或极小等)。
  6. 写出基本方程即优值函数满足的递归方程,以及端点条件。

3 逆序解法的计算框图

以自由终端、固定始端、指标函数取和的形式的逆序解法为例给出计算框图,其它情况容易在这个基础上修改得到。 一般化的自由终端条件为:
在这里插入图片描述其中φ为已知,固定始端条件可表示为 X 1 = { x 1 } = { x 1 ∗ } X_1=\{x_1\}=\{x_1^*\} X1={x1}={x1}
如果状态xk和uk是连续变量,用数值方法求解时需要按照精度要求进行离散化。 设状态xk的允许集合为:
在这里插入图片描述状态转移方程和阶段指标应对xk的每个取值xki和xui的每个取值ukj(j)计算,即Tk=Tk(xki)的允许集合为Tk=Tk(xk1,),vk=v(xki,uki(j))。最优值函数应对xk的每个取值xki计算。基本方程可以表为:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

用动态规划写下列线性规划

在这里插入图片描述 其 中 g k ( u k ) 为 任 意 的 已 知 函 数 。 其中g_k(u_k)为任意的已知函数。 gk(uk)
解 : 按 变 量 u k 的 序 号 划 分 阶 段 , 看 作 n 段 决 策 过 程 。 设 状 态 x 1 , x 2 , . . . , x n + 1 , 取 问 题 中 的 变 量 u 1 , u 2 , . . . , u n 为 决 策 。 状 态 转 移 方 程 为 : 解:按变量u_k的序号划分阶段,看作n段决策过程。设状态x_1,x_2,...,x_{n+1},取问题中的变量u_1,u_2,...,u_n为决策。状态转移方程为: uknx1,x2,...,xn+1,u1,u2,...,un
在这里插入图片描述 g k ( u k ) 为 阶 段 指 标 , 最 优 值 函 数 的 基 本 方 程 为 ( 注 意 到 x n + 1 = 0 ) g_k(u_k)为阶段指标,最优值函数的基本方程为(注意到x_{n+1}=0) gk(uk)xn+1=0
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是第四章的部分习题及答案,希望对你有帮助。 1. 设计一个O(nlogn)时间复杂度的算法,找出一个整数数组中的最大差值,其中最大值必须位于最小值之后。 解答:可以使用分治法,将数组分成两部分,分别求出左边的最大值和右边的最小值,然后比较两个值之间的差值,取最大值即可。具体实现如下: ```python def max_diff(arr): if len(arr) < 2: return 0 mid = len(arr) // 2 left_max = max(arr[:mid]) right_min = min(arr[mid:]) return max(right_min - left_max, max_diff(arr[:mid]), max_diff(arr[mid:])) ``` 2. 设计一个算法,找出一个整数数组中的最大子序列和。 解答:可以使用动态规划法,定义一个状态数组dp,dp[i]表示以第i个元素结尾的最大子序列和,转移方程为:dp[i] = max(dp[i-1] + arr[i], arr[i])。最后返回dp数组中的最大值即可。具体实现如下: ```python def max_subarray(arr): if not arr: return 0 dp = [0] * len(arr) dp[0] = arr[0] for i in range(1, len(arr)): dp[i] = max(dp[i-1] + arr[i], arr[i]) return max(dp) ``` 3. 给定一个长度为n的整数序列,设计一个算法,找出其中第k大的数。 解答:可以使用快速排序的思想,每次选定一个pivot,将数组分成两部分,左边的元素都小于pivot,右边的元素都大于等于pivot。然后比较pivot的位置和k的大小,如果pivot的位置大于k,则在左边继续查找;如果pivot的位置小于k,则在右边继续查找。具体实现如下: ```python def quick_select(arr, k): if not arr or k > len(arr): return None pivot = arr[-1] left = [x for x in arr[:-1] if x < pivot] right = [x for x in arr[:-1] if x >= pivot] if len(right) == k - 1: return pivot elif len(right) > k - 1: return quick_select(right, k) else: return quick_select(left, k - len(right) - 1) ``` 4. 设计一个算法,找出一个无序整数数组中出现次数超过一半的数。 解答:可以使用摩尔投票法,遍历整个数组,维护一个候选数和计数器,如果当前元素等于候选数,则计数器加1;否则计数器减1。如果计数器归零,则将当前元素作为候选数。最后再遍历一遍数组,统计候选数的出现次数,如果出现次数超过一半,则返回该候选数。具体实现如下: ```python def majority_element(arr): if not arr: return None candidate = None count = 0 for num in arr: if count == 0: candidate = num count += (1 if num == candidate else -1) if arr.count(candidate) > len(arr) // 2: return candidate else: return None ``` 5. 设计一个算法,找出一个整数数组中的两个元素,使它们的和等于一个给定的数。 解答:可以使用哈希表,遍历整个数组,对于每个元素,如果它的补数已经在哈希表中,则返回它们的下标;否则将该元素加入哈希表中。具体实现如下: ```python def two_sum(arr, target): if not arr: return None table = {} for i, num in enumerate(arr): complement = target - num if complement in table: return (table[complement], i) else: table[num] = i return None ``` 希望这些答案能够帮助你解决算法设计与分析第四章的部分习题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值