北邮研究生课程《算法设计与分析》知识总结 - Part 2

5539 字
28 分钟
北邮研究生课程《算法设计与分析》知识总结 - Part 2
2026-06-12

Ch 6. 分支限界法#

一、核心概念#

1. 分支限界法 整体定位#

  • 核心目标:求解全局最优解,不遍历全部可行解,通过预判提前剪枝,效率优于单纯回溯。
  • 一句话区别:回溯法=不撞南墙不回头(深搜、找所有解);分支限界法=见南墙提前绕路(广搜/优先搜、找最优解)。

2. 与回溯法对比#

对比维度回溯法分支限界法
搜索方式深度优先(DFS)广度优先(BFS) / 优先级优先
求解目标所有可行解,再选最优直接求全局最优解
剪枝规则仅剪掉违反约束的分支剪违规分支 + 剪不可能得到最优解的分支
状态管理共享状态,需要回溯撤销每个分支独立状态,无需回溯
适用场景N皇后、数独、全排列(求所有解)0-1背包、最短路径、调度(求最优解)

3. 解空间树结点定义#

  1. 活结点:已生成,但子结点未全部生成,仍有可扩展分支。
  2. 扩展结点:当前正在生成子结点的活结点(算法处理核心)。
  3. 死结点:无子分支、违反约束、无法继续扩展的结点。

4. 两大核心动作#

  1. 分支:对扩展结点,拆分所有合法决策,生成若干子结点(解空间树分叉)。
  2. 限界:计算分支理论最优值(限界值),若该分支理论最优都差于当前已找到的最优解,直接剪枝

二、分支限界法两大类型#

根据活结点处理顺序分为两类,优先队列式是考试重点

1. 队列式分支限界法(FIFO 分支限界)#

  • 底层逻辑:广度优先搜索 BFS,先进先出,逐层遍历。
  • 执行流程(简答/默写):
    1. 初始化:定义约束、限界函数、根结点、空队列、全局最优解;
    2. 队列非空则循环,为空则算法结束;
    3. 取出队首结点作为扩展结点;
    4. 分支生成所有合法子结点,计算限界值;
    5. 剪枝:叶子结点更新最优解;非叶子结点,限界值有希望则入队,否则剪枝;
    6. 回到步骤2循环。

2. 优先队列式分支限界法(LC/最小代价法)#

  • 底层逻辑:优先级优先,谁最可能得到最优解,先处理谁。
  • 优先级规则:
    • 最大值(背包、装载问题):限界值越大,优先级越高;
    • 最小值(最短路径、旅行商):限界值越小,优先级越高。
  • 与队列式两大核心区别
    1. 容器:普通队列 → 优先队列(堆)
    2. 取结点:取队首 → 取优先级最高结点;
  • 独有优化(考点):取出结点后,若其限界值 ≤ 当前最优解,直接提前终止算法(队列所有结点都无潜力)。

三、限界函数设计(灵魂+重难点#

限界函数决定剪枝效率,设计遵循三步法,安全原则是重中之重。

1. 三步设计法(简答题)#

  1. 明确优化目标
    • 求最大值(最大价值/重量):设计上界(分支理论最大收益);
    • 求最小值(最短路径/最小代价):设计下界(分支理论最小代价)。
  2. 安全性原则(绝对不能出错,考点核心)
    • 最大值问题:理论上界 ≥ 分支实际最大收益(不能误剪含最优解的分支);
    • 最小值问题:理论下界 ≤ 分支实际最小代价

    违规后果:剪掉最优分支,算法结果错误。

  3. 平衡精度与计算量:限界值越接近真实值,剪枝越强;同时保证计算简单。

2. 通用剪枝规则#

  • 最大值问题:上界 ≤ 当前最优解 → 剪枝;
  • 最小值问题:下界 ≥ 当前最优解 → 剪枝。

四、四大经典例题#

题型1:0-1背包问题(最常考计算题)#

  1. 问题特征:物品选/不选,不可分割,约束为背包容量,目标最大化总价值
  2. 解空间树:子集树,每个结点2个分支。
  3. 限界函数(上界)(必背计算方式)
    • 预处理:物品按单位重量价值从高到低排序;
    • 计算:剩余背包容量 → 允许物品分割,依次装剩余物品,得到理论最大价值(上界)。
  4. 解题核心步骤:初始化→取最高优先级结点→分支(装/不装)→计算上界→剪枝/入队→更新最优解→提前终止。

题型2:装载问题(0-1背包变种)#

  1. 问题转化:双船装载 → 单船最大化装载重量(等价0-1背包,价值=重量)。
  2. 约束:集装箱不可拆分,第一艘船载重限制。
  3. 限界函数(上界)
    • 预处理剩余重量数组remainW[i]:第i个及之后所有集装箱总重量;
    • 上界 = 当前已装重量 + remainW[i]
  4. 判定规则:第一艘船装满即达到理论最优,可直接终止。

题型3:子集和问题#

  1. 问题:从数组选子集,和等于目标值,元素不可重复选取。
  2. 解空间树:子集树。
  3. 限界函数(上下界结合)
    • 预处理剩余和数组remainSum[i]
    • 下界=当前和,上界=当前和+remainSum[i]
    • 剪枝:下界>目标值 或 上界<目标值,直接剪枝。
  4. 技巧:数组排序可大幅提升剪枝效率,找到解立即终止。

题型4:旅行商问题(TSP,最小值问题代表)#

  1. 问题特征:遍历所有城市一次,起点终点相同,求最短回路
  2. 解空间树:排列树,叶子数为 (n1)!(n-1)!
  3. 限界函数(下界)(最小值专用)
    • 预处理:每个城市最小出边
    • 下界 = 已走路程 + (剩余城市最小出边和 + 返回起点最小距离) / 2。
  4. 特点:最坏复杂度 O(n!)O(n!),n较大时仅能依靠限界函数剪枝。

五、复杂度分析#

统一规律(四个例题通用):

  1. 时间复杂度
    • 最坏情况:无剪枝,和暴力搜索一致:
      • 子集树(背包、装载、子集和):O(2n)O(2^n)
      • 排列树(旅行商):O(n!)O(n!)
    • 实际情况:限界函数越精准,扩展结点越少,效率远高于回溯。
  2. 空间复杂度
    • 最坏情况:O(2n)O(2^n)O(n!)O(n!),主要开销为优先队列存储活结点
    • 实际情况:剪枝越强,队列结点越少,空间越小;分支限界空间通常高于回溯法

Ch 7. 随机化算法#

一、整体概述#

  1. 前面所学分治、动态规划、贪心、回溯、分支限界均为确定性算法:相同输入→相同执行步骤+相同输出。
  2. 随机化算法引入随机选择,牺牲部分确定性,换取更高平均效率,甚至解决确定性算法难以处理的问题。
  3. 应用领域:密码学、大数据、机器学习、分布式系统。

二、核心概念#

1. 随机化算法定义#

随机化算法可看作带两组输入的确定性算法:

  • 常规问题输入 xx
  • 随机比特串 rr(随机数生成,多项式长度) 同一输入xx,输出随随机串rr变化;概率特性仅由rr决定。

2. 两大核心分类#

(1)拉斯维加斯(Las Vegas)算法

核心特点:零错误,运行时间随机

  1. 正确性:输出100%正确Pr[A(x)=f(x)]=1\Pr[A(x)=f(x)]=1
  2. 运行时间:随机变量,期望运行时间有界
  3. 优化方式:多次运行可降低最坏耗时
  4. 典型例题:随机化快速排序、随机化快速选择

(2)蒙特卡洛(Monte Carlo)算法

核心特点:运行时间确定,结果存在有界错误

  1. 错误率:错误概率严格小于给定阈值ϵ\epsilonPr[A(x)f(x)]<ϵ\Pr[A(x) \neq f(x)]<\epsilon
  2. 运行时间:固定,不会超时
  3. 优化方式:多次执行,错误概率指数级下降
  4. 典型例题:蒙特卡洛求圆周率π

考试必考题:区分两种随机算法的特性、举例。

3. 随机数生成#

计算机使用两类随机数:

  1. 伪随机数(PRNG)

    • 本质:确定性函数,依靠种子生成序列,可复现结果
    • 常用算法:线性同余LCG、梅森旋转MT19937、Xorshift
    • 优缺点:速度快、可复现;非真随机,不适用高安全密码场景
    • 工具:Python random 库,random.seed() 设置种子
  2. 真随机数

    • 来源:物理随机现象(鼠标、键盘、CPU温度、放射性衰变、量子效应)
    • 优缺点:真正随机、安全性高;生成慢、成本高
    • 适用:密码学、金融等高安全场景

三、三大经典案例#

案例1:随机化快速排序(拉斯维加斯算法)#

1. 改进思路

确定性快排缺陷:固定选首/尾元素为主元,有序数组下复杂度退化至 O(n2)O(n^2)核心优化每次在当前子数组中随机选主元,打破最坏输入场景。

2. 执行流程

  1. 随机选取区间内主元下标,将主元交换到区间最右侧;
  2. 执行标准快排分区;
  3. 递归排序左右子区间。

3. 复杂度分析

  • 期望时间复杂度:O(nlogn)\boldsymbol{O(n\log n)}(无论输入形态,稳定)
  • 最坏时间复杂度:O(n2)O(n^2)发生概率极低,几乎可忽略
  • 空间复杂度:期望 O(logn)O(\log n)(递归栈),最坏 O(n)O(n)(概率极低)
  • 实际性能:常数因子小,工程中最快排序之一。

4. 代码要点

核心函数:random_select(随机选主元)、partition(分区,与普通快排一致)、递归主体。

案例2:随机化快速选择(拉斯维加斯算法)#

1. 问题

在无序数组中找第k小元素,目标:比排序(O(nlogn)O(n\log n))更快。

2. 算法思想

基于随机主元+分治,不完整排序,仅递归处理目标元素所在分支:

  1. 随机选主元、分区;
  2. 设左区间(≤主元)元素个数为mm
    • k=mk = m:主元就是第k小元素,直接返回;
    • k<mk < m:目标在左区间,递归左半;
    • k>mk > m:目标在右区间,递归右半,查找第 km1k-m-1 小。

3. 复杂度

  • 期望时间复杂度:O(n)\boldsymbol{O(n)}(线性时间,核心优势)
  • 最坏时间复杂度:O(n2)O(n^2)(低概率)
  • 空间复杂度:O(logn)O(\log n)(递归栈)

案例3:蒙特卡洛法求π#

1. 数学原理(简答/计算题)

几何概率模型:

  • 边长为2的正方形,面积 S=4S_{正}=4;内部单位圆半径r=1r=1,面积 S=πS_{圆}=\pi
  • 概率关系:圆内点数M总投点数Nπ4\dfrac{\text{圆内点数}M}{\text{总投点数}N} \approx \dfrac{\pi}{4}
  • 推导公式:π4×MN\boldsymbol{\pi \approx 4 \times \dfrac{M}{N}}

2. 执行步骤

  1. 生成 NN 组随机坐标 (x,y)(x,y)x,y[1,1]x,y\in[-1,1]
  2. 判断点是否在单位圆内:x2+y21x^2+y^2 \le 1,统计圆内点数MM
  3. 代入公式估算π\pi

3. 复杂度与精度

  • 时间复杂度:O(N)\boldsymbol{O(N)}(与投点数量线性相关)
  • 空间复杂度:O(1)\boldsymbol{O(1)}(常数空间)
  • 精度规律:误差与 1N\dfrac{1}{\sqrt{N}} 成正比;误差减半,投点数需扩大4倍

Ch 8. 遗传算法#

一、整体定位#

  1. 算法归属:遗传算法(GA)属于进化计算、随机化搜索优化算法,灵感来自达尔文自然选择、孟德尔遗传定律。
  2. 适用场景(高频考点) 针对NP难问题、搜索空间极大、约束复杂的大规模优化问题;传统确定性算法(分治、动态规划、贪心、分支限界)在这类问题上效率极低甚至无法求解。
  3. 传统算法 VS 遗传算法
对比维度传统优化算法(梯度下降、DP)遗传算法
搜索方式单点出发,单向搜索种群并行多点搜索
最优解凸问题可保证全局最优不保证全局最优,大概率得到近似最优
数学要求需函数可导、有明确数学模型无需可导,仅需适应度函数
适用场景小规模、凸优化大规模、NP难、多约束问题
核心优势精度高、收敛快鲁棒性强、通用性好
Note

通俗记忆: 传统算法=单打独斗;遗传算法=群体作战。

二、核心概念与生物映射#

1. 遗传算法定义#

遗传算法是模拟生物自然选择、遗传变异的随机优化算法,将解编码为染色体,通过选择、交叉、变异三大核心操作迭代寻优。

2. 生物学 ↔ 算法概念映射#

生物学概念算法对应概念含义
个体候选解问题的一个可行解
染色体解的编码解的表示形式(二进制/实数/排列)
基因编码基本单元染色体中的最小元素
种群解的集合一组候选解
适应度解的评价指标数值越大,解质量越好
选择优胜劣汰挑选优质个体繁殖
交叉基因重组父代交换基因生成子代
变异基因突变随机改变基因,增加多样性
进化迭代优化种群逐代更新,解持续优化

三、标准执行流程#

完整7步流程,考试要求能默写/简述:

  1. 问题定义:确定解空间、设计适应度函数
  2. 编码设计:把解转换成染色体(编码)
  3. 初始化种群:随机生成指定规模的初始个体集合
  4. 计算适应度:评价每一个体好坏
  5. 终止判断:达到最大迭代次数/适应度收敛 → 输出最优解;否则继续
  6. 三大遗传操作:选择 → 交叉 → 变异
  7. 生成新一代种群(常用精英保留策略),返回第4步循环

四、三大核心操作#

1. 选择操作(优胜劣汰)#

作用:优先选择适应度高的个体进入交配池,传递优良基因。

三种经典实现:

  1. 轮盘赌选择(公式必考)

    个体ii被选中概率:pi=fij=1Nfj\displaystyle p_i=\frac{f_i}{\sum_{j=1}^N f_j}

    特点:概率与适应度成正比。

  2. 锦标赛选择(工程常用)

    随机选kk个个体,取适应度最高者;鲁棒性强。

  3. 精英保留策略(必背)

    将当代最优的若干个体直接复制到下一代,防止最优解丢失。

2. 交叉操作(基因重组)#

作用:组合父代优良基因,产生新个体。

  • 二进制编码:单点交叉、多点交叉、均匀交叉
  • 排列编码(TSP问题):顺序交叉(保证城市不重复,合法路径)

3. 变异操作(基因突变)#

作用:增加种群多样性,避免算法陷入局部最优

  • 二进制编码:位翻转变异(0↔1)
  • 实数编码:均匀变异、高斯变异
  • 排列编码(TSP):交换变异(随机交换两个基因位置)

五、算法参数与取值#

参数含义推荐取值说明
pmp_m变异概率0.0010.10.001 \sim 0.1,常用1/L1/LLL为染色体长度)概率不能过高,否则破坏优良解
pcp_c交叉概率0.8~0.9取值偏高,保证基因重组
TT最大迭代代数100~10000复杂度高则增大,可提前终止
ee精英个体数1~5过多会降低种群多样性
NN种群规模根据问题设定(案例取100、200)规模太小易早熟,太大速度慢

六、算法常见问题及解决方案#

  1. 过早收敛

    现象:未找到全局最优就陷入局部最优,个体高度相似。

    解决:增大种群、提高变异概率、改用锦标赛选择、小生境技术。

  2. 收敛速度慢

    现象:迭代多代,适应度提升极慢。

    解决:优化适应度函数、调整交叉/变异概率、启用精英保留、优化编码。

  3. 种群多样性丧失

    现象:个体趋同,失去进化能力。

    解决:提高变异概率、随机移民策略、适应度共享。

七、两大经典案例(综合题、计算题核心,考试重点#

案例1:0-1背包问题(二进制编码)#

1. 算法设计

  1. 编码:二进制串,长度=物品数;位=1表示选该物品,0表示不选。
  2. 适应度函数
    • 总重量 ≤ 背包承重:适应度 = 物品总价值
    • 总重量 > 背包承重:适应度 = 0(惩罚非法解)
  3. 操作配置:锦标赛选择、单点交叉、位翻转变异、精英保留。

2. 复杂度分析(计算题考点)

  • 单代时间复杂度:O(Nn)O(N \cdot n)NN种群规模,nn物品数)
  • 总时间复杂度O(TNn)\boldsymbol{O(T \cdot N \cdot n)}TT迭代次数)
  • 空间复杂度:O(Nn)\boldsymbol{O(N \cdot n)}
  • 对比优势:遗传算法复杂度和背包载重WW无关,适合超大载重场景(动态规划O(nW)O(nW)WW极大时失效)。

案例2:旅行商问题 TSP(排列编码)#

1. 算法设计

  1. 编码整数排列,每个数字代表城市,每个城市仅出现一次。
  2. 适应度函数:总路程倒数(最小化问题转化为最大化适应度,路程越短,适应度越高)。
  3. 专属操作:顺序交叉交换变异(保证排列合法,无重复城市)。

2. 复杂度

时间、空间复杂度和0-1背包一致:O(TNn)O(T \cdot N \cdot n)O(Nn)O(N \cdot n)


Ch 9. 模拟退火算法#

一、整体概述#

1. 算法来源与本质#

  1. 灵感来源:冶金学金属退火——高温加热、缓慢冷却,原子趋于能量最低的稳定晶体状态。
  2. 算法定义:基于蒙特卡洛迭代随机化全局优化算法;单点迭代搜索,允许以一定概率接受较差解,从而跳出局部最优,最终逼近全局最优。
  3. 应用场景:旅行商TSP、0-1背包、车间调度、芯片设计、神经网络训练等组合优化问题。

2. 模拟退火 VS 遗传算法#

对比维度遗传算法模拟退火算法
搜索方式群体搜索(多个个体)单点搜索(单个解迭代)
跳出局部最优交叉、变异产生新个体按概率接受坏解
收敛性不保证全局最优满足条件时理论收敛到全局最优
参数数量参数多参数少
实现难度中等简单
优缺点并行强、易早熟收敛全局搜索强、速度偏慢

通俗记忆:遗传算法=一群人找路;模拟退火=一个人摸索,偶尔走弯路找全局最优。

二、物理退火 ↔ 模拟退火 映射关系#

理解算法的底层逻辑,考试常考对应关系:

物理退火模拟退火算法说明
原子状态问题的候选答案
能量目标函数值值越小,解越优
温度 TT控制参数决定接受坏解的概率,温度越高,容错性越强
加热初始化高温 T0T_0前期大范围搜索
等温过程同一温度下多次迭代(马尔可夫链)单温度下充分搜索
冷却温度逐步下降逐步降低接受坏解的概率
基态(最低能量)全局最优解问题最终答案

三、模拟退火完整执行步骤#

1. 通用算法步骤#

设解空间SS,目标函数ff(默认求最小值;求最大值可对目标函数取负)

  1. 初始化:初始温度T=T0T=T_0、初始解x0x_0、最优解xbest=x0x_{best}=x_0
  2. 等温迭代(马尔可夫链,长度LL):循环LL
    • 对当前解随机扰动,生成新解xx'
    • 计算目标函数差值 Δf=f(x)f(x)\Delta f = f(x')-f(x)
    • Metropolis准则判断是否接受新解;
    • 若新解更优,更新全局最优解xbestx_{best}
  3. 降温:按降温策略更新温度TT
  4. 终止判断:温度低于终止温度TfT_f或达到最大迭代,停止;
  5. 输出全局最优解xbestx_{best}

2. 三大核心操作#

(1)状态产生函数(生成新解)

对当前解做随机扰动,不同编码对应不同方式:

  • 二进制编码(如0-1背包):位翻转
  • 排列编码(如TSP旅行商):交换、插入
  • 实数编码:高斯/均匀随机扰动

(2)状态接受函数:Metropolis准则

p={1,Δf<0(新解更优,直接接受)eΔf/T,Δf0(新解更差,按概率接受)p= \begin{cases} 1, & \Delta f < 0 \quad(\text{新解更优,直接接受})\\ e^{-\Delta f/T}, & \Delta f \ge 0 \quad(\text{新解更差,按概率接受}) \end{cases}
Note

关键结论

  1. Δf<0\Delta f<0:新解更好,必定接受
  2. Δf0\Delta f\ge0:新解更差,概率 eΔf/Te^{-\Delta f/T} 接受;
  3. 温度TT越高,接受坏解概率越大;
  4. Δf\Delta f越大(新解越差),接受概率越小;
  5. 高温阶段大胆“走弯路”跳出局部最优;降温后逐渐收敛。

(3)温度更新函数(降温策略)

三种策略,区分特点与适用场景:

  1. 指数降温(最常用)Tk+1=αTkT_{k+1}=\alpha \cdot T_k,降温系数 α[0.85,0.95]\alpha \in [0.85,0.95]

    特点:兼顾效率与收敛,工程首选。

  2. 线性降温Tk+1=TkβT_{k+1}=T_k-\beta

    特点:降温快,易陷入局部最优

  3. 对数降温Tk+1=T0/log(1+k)T_{k+1}=T_0/\log(1+k)

    特点:理论保证全局收敛,但降温极慢,几乎不实际使用

3. 核心参数#

  • T0T_0:初始高温;TfT_f:终止温度;
  • LL:马尔可夫链长度(单温度下迭代次数);
  • α\alpha:降温系数。

四、两大经典案例#

案例1:0-1 背包问题#

1. 问题转化

原目标:最大化总价值 → 模拟退火求最小值,因此目标函数取负

2. 约束处理:惩罚函数

对超重的不可行解施加惩罚:

f(x)=总价值+100×max(0,总重量W)f(x) = -\text{总价值} + 100 \times \max(0,\text{总重量}-W)

惩罚系数取大数,保证不可行解函数值远大于可行解。

3. 编码与新解生成

  • 编码:二进制串,1选物品,0不选;
  • 扰动方式:随机翻转一位二进制位

4. 复杂度

  • 时间复杂度:O(T×L×n)\boldsymbol{O(T \times L \times n)}

    TT:温度迭代次数,LL:马尔可夫链长度,nn:物品数量

  • 空间复杂度:O(n)\boldsymbol{O(n)}(仅存储解向量)

案例2:旅行商问题 TSP#

1. 编码与新解生成

  • 编码:城市排列(每个城市出现且仅出现一次);
  • 扰动方式:随机交换两个位置的城市,保证解合法。

2. 目标函数

路线总路程,直接求最小值,无需取负。

3. 解题流程核心逻辑

随机初始路线 → 交换生成新路线 → Metropolis准则判接受 → 降温迭代 → 输出最短路径。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
北邮研究生课程《算法设计与分析》知识总结 - Part 2
https://llm-tech.com.cn/posts/bupt-algo-2/
作者
Ming
发布于
2026-06-12
许可协议
CC BY-NC-SA 4.0
最后更新于 2026-06-12,距今已过 39 天

部分内容可能已过时

Profile Image of the Author
Ming
你是来找 Ming 学习的吗
🎉 欢迎来到 Ming 的博客
这里是我的个人博客,分享 AI Infra、LLM 等技术内容。欢迎关注交流!
分类
标签
站点统计
文章
17
分类
10
标签
16
总字数
52,871
运行时长
0
最后活动
0 天前

目录