复杂系统 | 考前知识点总结(不完全)
这份知识点总结(cheat sheet),是基于 21 级直博师兄的押题(因为我没太听课🥶);
然而教学大纲比较与时俱进,导致他押题不太准(或许放到两年前是准的叭),所以这份笔记有很多考点没有覆盖(如事件驱动优化 EBO、RL 基础 policy gradient TRPO PPO 等)。
相关链接:
- RL 基础 | Value Iteration 的收敛性证明
- RL 基础 | Policy Iteration 的收敛性证明
- 复杂系统 | 20240116 · 考试题目回忆版
- “嵌套分区法,是一种良策;将海洋分成块,每块都探测。”
- 概述:基于事件的优化方法 / 事件驱动优化 / Event-Based Optimization / EBO
1 序优化 Ordinal Optimization
OO 考一个概率或证明指数收敛。
1.1 关于 OO 的概率计算
正态分布的概率密度函数:
正态分布相加后的分布:
正态分布取 N 均值后的分布:
正态分布相乘后的分布:
1.2 order 相对 value 的指数收敛
何教授的 OO 课本的 21 / 33 页。
(每个 design 都满足
放缩:当 k = min(g,s) 时,去证
定义 Event A 为 达不到完美:
定义 Event B 为 循规蹈矩的反面:存在一个 i 使得
若满足 !Event B,就完全没有 misalignment;不过,即使发生 Event B,也可能完全没有 misalignment。
因此,Pr A ≤ Pr B。
这样就得到了。
1.3 good enough 相对 optimal 的指数收敛
何教授的 OO 课本的 26 / 38 页。
对 blind pick 的 selection rule,希望证明,
首先,有
对
因此得到
对 horse racing 的 selection rule,貌似也可以得到上面的结论。(别看了,就用上面的结论吧。)
2 Policy Iteration & Value Iteration 的收敛性证明
value iteration:https://www.cnblogs.com/moonout/p/17783506.html
policy iteration:https://www.cnblogs.com/moonout/p/17804874.html
DP 收敛到最优解的证明:只要是 MDP、满足无后效性(?),就有 Bellman 最优性原理,最优策略的子策略一定也是最优的。
3 排队论 Queueing Theory
另一个课件,可参考:https://lrita.github.io/images/posts/math/排队论及其应用浅析.pdf
3.1 Memoryless Triangle
好像就是 possion 分布的相关。
我 t 时刻到达车站等车,距前一辆车离开的时间是(听说)什么截尾的指数分布,距后一辆车到来的时间是 指数分布。
证明两辆车到来的时间差 X 满足指数分布,等价于 那是个泊松随机过程。
顾客到达的时间间隔呈指数分布与系统状态呈泊松分布是等效的
基础知识:
- Poisson 分布:一种离散概率分布。
。参数 λ 是单位时间内随机事件的平均发生次数。期望和方差均为 λ 。- 适合于描述单位时间内随机事件发生的次数,排队时一定时间内到达的人数。
- Poisson 过程:
- 一种累计随机事件发生次数的,最基本的独立增量过程。
- 需要满足三个条件:
- ① P(X(0)=0)=1。
② 不相交区间上增量相互独立,即对一切 , 相互独立。
③ 增量 (t>s) 的概率分布为泊松分布。 - 重要性质:在区间 [t, t + τ] 内发生的事件的数目的概率分布为:
,满足 Poisson 分布。
- Poisson 过程的 Inter-arrival time:
- 【Poisson 的 memoryless】接下来 t 秒发生事件的概率(无论之前 t0 秒有无发生事件)
。 - 【Constant Arrival rate】接下来 Δt 秒发生事件的概率为
,对于过小的 Δt,o(Δt) 忽略不计。 - 【Exponential Inter-arrival time】计算前 t 秒内都没有发生事件的概率(或接下来 t 秒都没有发生事件的概率),把 0-t 的事件拆成无穷个 Δt ,
。 - 【Poisson Arrival in [0,t) 】在 interval [0,t] 内发生事件数量,满足 Poisson 分布,有 P(t+Δt 内发生 n 个事件) = P(t 内发生 n 个事件) P(Δt 内没发生事件) + P(t 内发生 n-1 个事件) P(Δt 内发生 1 个事件) 。
- 【Poisson 的 memoryless】接下来 t 秒发生事件的概率(无论之前 t0 秒有无发生事件)
Memoryless Triangle - 三者等价:
- Constant Arrival rate;Poisson Arrival in [0,t) ;Exponential Inter-arrival time。
3.2 简单 M/M/1 系统
A:到达时间间的分布。B:服务时间分布。A 和 B 取以下符号集的值,这些符号对应于括号中的分布:M(指数);Er(r-stage Erlangian);HR(R-stage 超指数);D(确定性);G(一般)。
m:server 数量。K:系统的 storage 容量。M: size of customer population。
MM1:
https://zhuanlan.zhihu.com/p/639097677
基本定义:
- 到达速率和服务速率都是指数分布的;系统中只有一台服务器;缓冲区大小是无限的。
- 到达速率:A,单位时间内到达请求数量 λ,
。 - 服务速率:B,单位时间内处理请求数量 μ,
。 - ρ = λ/μ 。
分布:
- 在时间 t 内到达的顾客总数 k,是一个泊松事件过程。在时间 t 到达的顾客呈泊松分布。
重要公式:
- Average number of customers in the system N = ρ/(1-ρ)
- Average time in system τ_d = 1/(μ-λ)
- Average waiting time W = ρN/λ
- Average time in system = average waiting time + average service time (1/μ).
应用 Little's Law 做计算:
N = λ * 1/(μ-λ) ,N = average time in system * customer arrival 。
3.3 Little's Law
在一个稳定的系统中,长期的平均顾客人数(N),等于长期的有效抵达率(λ),乘以顾客在这个系统中的平均时间(T)。或者,我们可以用一个代数式来表达:N = λT。
(队列长度 = 平均到达率 单位时间到多少人 × 人在系统内的平均时间)
虽然此公式看起来直觉性的合理,它依然是个非常杰出的推导结果,因为此关系式“不受到货流程分配、服务分配、服务顺序,或任何其他因素影响”。
直观证明:
- t 内的最后一个到达将在 (t+ε) 离开系统。所以 arrival(t) = departure(t+ε) 。(a 和 d 是现在到达 / 离开的总人数)
- 因此,N(t) = a(t) - d(t) = d(t+ε) - d(t)。
- 在稳定状态下,ε=T(即平均通过排队系统的时间(排队时间?)为 T),出发率 = 到达率 = λ 。
- 所以 N(t) = d(t+ε) - d(t) = λ(t+ε) - λ(t) = λT。
写公式来证明:
- 第一行:N(tau) 是 tau 时刻系统内的人数。a(t) 是来人的函数,单调递增。ε 是 最后一个人还有多久走(见 slides 57 页的图)。第一行的意思是,系统内人数的积分(即 从 0 到 t 都来了多少人) = a(t) 个来的人都分别呆了多久 - ε。
- 第二行:每个人平均在系统内呆的时间 T 的计算。λ:长远来看(t → 无穷)平均每时刻来多少人。N:每一时刻在系统内的人数 / 总共过去的时间 = 每时刻平均有多少人在系统内(感觉像平均值)。
- 第三行:假装可以拆成这样的极限相乘吧(不会证)。
- 第四行:是显然的。ε 再大也是有限量,跟 lambda mu 是一个量级的(大概)。
4 No Free Lunch
直接看课件吧。问题:简单解释 No Free Lunch 定理。
回答:
1 我们考虑简单的 状态空间离散化且有限的 问题场景。假设 x(N 维)是优化变量,f 是性能函数(简化考虑,只可能输出两个值,1 好 0 坏),y = f(x) 为性能。我们希望寻找 x,使得 f(x) = 1。
所有的 f 有 2^N 种。可以列一个 x × f(x) 的 N × 2^N 维度的矩阵,代表所有的 f。如果我们对我们的问题的结构一无所知,那么就不知道 f 在矩阵的哪一列,可以视为对矩阵的所有列求平均的期望。这样的话,无论如何选择 x,其性能的期望都不会比 blind pick 更好。对于连续的情况,也是一样的。
2 更危险的情况是,如果我们知道一些关于最优解的先验。比如说,我们听说 f 矩阵左边的列是相对更优的,去选择左边的列作为问题结构的先验。如果这一知识是正确的,那么情况是好的。如果这一知识错误,相对更优的列在其他位置,那么左边的列其实会相对更差,会导致我们的性能比 blind pick 更差。
3 同时,若想寻找最优解,那么会受到维度灾难的影响:寻找最优解的复杂度,随着问题规模而指数增加。
4 因此,优化是复杂的,利用启发式的先验来解决问题,也是脆弱的。有两个方法可以缓解这种问题:1. 比较序而非值,2. 选择足够好而非最优。同时,可以利用问题结构,将问题建模成分层或分模块的形式,以简化空间。
5 嵌套分区 Nested Partition
估计会考 nested partition 找最优解的模拟。
一个部分错误的算法:https://www.cnblogs.com/moonout/p/17962129
Nested Partition 算法:
- 第一步,初始化。选择一个初始的可行解空间 X,设定分区的层数 d 和每层的分区数 M,设定停止条件。
- 第二步,分区(partitioning)。将当前的可行解空间 X 分解为 M 个子区域,记为 X_1, X_2, ..., X_M,并保留一个补充区域 X_M+1,包含 X 中剩余的解。
- 第三步,采样。在每个子区域中随机生成(按一定规则生成)若干个可行解,记为 x_1, x_2, ..., x_M,以及 x_M+1。
- 第四步,评估。计算每个可行解的目标函数值 f(x_i),并根据一定的规则(课件上直接采取最佳值 min f(x) ),确定每个子区域的期望指标(promising index)g(X_i),用于衡量子区域的优劣。
- 第五步,选择。比较每个子区域的期望指标 g(X_i),找出最大(或最小)的一个,记为 g(X_j),并将对应的子区域 X_j 作为最有希望的区域。
- 第六步,更新。
- 如果满足停止条件(达到最大迭代次数、最优解的改善量小于阈值、最 promising 的区域已不能再分解),则停止算法,输出当前的最优解 x_j 。
- 如果当前 promising index 比之前找到的最大(最小)值小(大),则回溯到之前最 promising 的区域。
- 否则,将可行解空间 X 更新为 X_j,回到第二步,继续分区。
6 Alias 算法
别名算法 Alias 算法,必考,证明和操作。出条件,把 r 和 a 写出来。
- https://zhuanlan.zhihu.com/p/54867139(不如第二个可读)
- https://zhuanlan.zhihu.com/p/111885669
- https://zhuanlan.zhihu.com/p/591782173(有证明,思路是对的,但感觉说的不够清楚)
- https://blog.csdn.net/rover2002/article/details/106760664
证明一定能把
- K = 1 显然。
- K → K+1:若 pi = 1 则每个桶一个。
- 否则,一定存在一个
,并且存在 使得 ,否则 ,又有 ,无法满足 。 去掠夺 ,使得第 K+1 个桶被填满。然后对前 K 个桶执行 K=K 的算法。数归得证。
更快的证明:

def create_alias_table(area_ratio): # 根据概率分布乘以 N 的结果,构建 accept 和 alias 数组 l = len(area_ratio) accept, alias = [0] * l, [0] * l small, large = [], [] # 存储面积小于 1 和大于 1 的事件的索引 for i, prob in enumerate(area_ratio): if prob < 1.0: small.append(i) else: large.append(i) while small and large: # 将大于 1 的事件的多余部分分配给小于 1 的事件 small_idx, large_idx = small.pop(), large.pop() accept[small_idx] = area_ratio[small_idx] alias[small_idx] = large_idx area_ratio[large_idx] = area_ratio[large_idx] - (1 - area_ratio[small_idx]) if area_ratio[large_idx] < 1.0: small.append(large_idx) else: large.append(large_idx) while large: # 处理剩余的大于 1 的事件,将其 accept 设为 1 large_idx = large.pop() accept[large_idx] = 1 while small: # 处理剩余的小于 1 的事件,将其 accept 设为 1 small_idx = small.pop() accept[small_idx] = 1 return accept, alias
7 OCBA
7.1 OCBA 算法
- 总的 budget 是 T。先为每个 design 分配 n0 个 simulation。
- 然后,设置每次的新 budget allocation:
- "将计算预算(即额外模拟的数量)增加 A",比如 10 个 10 个增加。
- 对 i ≠ j ≠ b,设置
。(signal-noise ratio rule) - 对当前的最优 design b(
),计算 。 - 大概是,先对所有 i j ≠ b 设置 budget allocation(可以设置那个比值 = k),然后再计算 b 的 budget allocation(= 常数 × k)。(应该是可以做到的)
- 然后,分配 simulation budget:新增
。
7.2 OCBA 的证明
OCBA 证明:希望在有限次 simulation 下最大概率找到最优解,1. 放缩找到最优解的概率,得到一个下界,2. KKT 条件 拉格朗日松弛 得到 N(计算量)如何分配。
假设 tilde J 是给定了观测的均值方差的 真实 performance 的后验分布。
第一步,放缩:
然后转化问题,把 Ni ≥ 0 的约束条件去掉(?),让 Ni 可以取任意实数值。
第二步,Lagrange 松弛:(F 其实就是 Lagrange 函数 L)
然后直接硬写 KKT 条件:
考察 Nb 与 Ni 的关系,可以直接得到
考察 Ni 与 Nj 的关系,令 T 趋于无穷,可以得到
(具体公式懒得抄,感觉也背不过…)
本文作者:MoonOut
本文链接:https://www.cnblogs.com/moonout/p/18009294
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2023-02-06 citespace 文献计量工具初探