北邮研究生课程《算法设计与分析》知识总结 - Part 2
Ch 6. 分支限界法
一、核心概念
1. 分支限界法 整体定位
- 核心目标:求解全局最优解,不遍历全部可行解,通过预判提前剪枝,效率优于单纯回溯。
- 一句话区别:回溯法=不撞南墙不回头(深搜、找所有解);分支限界法=见南墙提前绕路(广搜/优先搜、找最优解)。
2. 与回溯法对比
| 对比维度 | 回溯法 | 分支限界法 |
|---|---|---|
| 搜索方式 | 深度优先(DFS) | 广度优先(BFS) / 优先级优先 |
| 求解目标 | 求所有可行解,再选最优 | 直接求全局最优解 |
| 剪枝规则 | 仅剪掉违反约束的分支 | 剪违规分支 + 剪不可能得到最优解的分支 |
| 状态管理 | 共享状态,需要回溯撤销 | 每个分支独立状态,无需回溯 |
| 适用场景 | N皇后、数独、全排列(求所有解) | 0-1背包、最短路径、调度(求最优解) |
3. 解空间树结点定义
- 活结点:已生成,但子结点未全部生成,仍有可扩展分支。
- 扩展结点:当前正在生成子结点的活结点(算法处理核心)。
- 死结点:无子分支、违反约束、无法继续扩展的结点。
4. 两大核心动作
- 分支:对扩展结点,拆分所有合法决策,生成若干子结点(解空间树分叉)。
- 限界:计算分支理论最优值(限界值),若该分支理论最优都差于当前已找到的最优解,直接剪枝。
二、分支限界法两大类型
根据活结点处理顺序分为两类,优先队列式是考试重点。
1. 队列式分支限界法(FIFO 分支限界)
- 底层逻辑:广度优先搜索 BFS,先进先出,逐层遍历。
- 执行流程(简答/默写):
- 初始化:定义约束、限界函数、根结点、空队列、全局最优解;
- 队列非空则循环,为空则算法结束;
- 取出队首结点作为扩展结点;
- 分支生成所有合法子结点,计算限界值;
- 剪枝:叶子结点更新最优解;非叶子结点,限界值有希望则入队,否则剪枝;
- 回到步骤2循环。
2. 优先队列式分支限界法(LC/最小代价法)
- 底层逻辑:优先级优先,谁最可能得到最优解,先处理谁。
- 优先级规则:
- 求最大值(背包、装载问题):限界值越大,优先级越高;
- 求最小值(最短路径、旅行商):限界值越小,优先级越高。
- 与队列式两大核心区别:
- 容器:普通队列 → 优先队列(堆);
- 取结点:取队首 → 取优先级最高结点;
- 独有优化(考点):取出结点后,若其限界值 ≤ 当前最优解,直接提前终止算法(队列所有结点都无潜力)。
三、限界函数设计(灵魂+重难点)
限界函数决定剪枝效率,设计遵循三步法,安全原则是重中之重。
1. 三步设计法(简答题)
- 明确优化目标
- 求最大值(最大价值/重量):设计上界(分支理论最大收益);
- 求最小值(最短路径/最小代价):设计下界(分支理论最小代价)。
- 安全性原则(绝对不能出错,考点核心)
- 最大值问题:
理论上界 ≥ 分支实际最大收益(不能误剪含最优解的分支); - 最小值问题:
理论下界 ≤ 分支实际最小代价;
违规后果:剪掉最优分支,算法结果错误。
- 最大值问题:
- 平衡精度与计算量:限界值越接近真实值,剪枝越强;同时保证计算简单。
2. 通用剪枝规则
- 最大值问题:
上界 ≤ 当前最优解→ 剪枝; - 最小值问题:
下界 ≥ 当前最优解→ 剪枝。
四、四大经典例题
题型1:0-1背包问题(最常考计算题)
- 问题特征:物品选/不选,不可分割,约束为背包容量,目标最大化总价值。
- 解空间树:子集树,每个结点2个分支。
- 限界函数(上界)(必背计算方式)
- 预处理:物品按单位重量价值从高到低排序;
- 计算:剩余背包容量 → 允许物品分割,依次装剩余物品,得到理论最大价值(上界)。
- 解题核心步骤:初始化→取最高优先级结点→分支(装/不装)→计算上界→剪枝/入队→更新最优解→提前终止。
题型2:装载问题(0-1背包变种)
- 问题转化:双船装载 → 单船最大化装载重量(等价0-1背包,价值=重量)。
- 约束:集装箱不可拆分,第一艘船载重限制。
- 限界函数(上界)
- 预处理剩余重量数组
remainW[i]:第i个及之后所有集装箱总重量; - 上界 = 当前已装重量 +
remainW[i]。
- 预处理剩余重量数组
- 判定规则:第一艘船装满即达到理论最优,可直接终止。
题型3:子集和问题
- 问题:从数组选子集,和等于目标值,元素不可重复选取。
- 解空间树:子集树。
- 限界函数(上下界结合)
- 预处理剩余和数组
remainSum[i]; - 下界=当前和,上界=当前和+
remainSum[i]; - 剪枝:下界>目标值 或 上界<目标值,直接剪枝。
- 预处理剩余和数组
- 技巧:数组排序可大幅提升剪枝效率,找到解立即终止。
题型4:旅行商问题(TSP,最小值问题代表)
- 问题特征:遍历所有城市一次,起点终点相同,求最短回路。
- 解空间树:排列树,叶子数为 。
- 限界函数(下界)(最小值专用)
- 预处理:每个城市最小出边;
- 下界 = 已走路程 + (剩余城市最小出边和 + 返回起点最小距离) / 2。
- 特点:最坏复杂度 ,n较大时仅能依靠限界函数剪枝。
五、复杂度分析
统一规律(四个例题通用):
- 时间复杂度
- 最坏情况:无剪枝,和暴力搜索一致:
- 子集树(背包、装载、子集和):;
- 排列树(旅行商):;
- 实际情况:限界函数越精准,扩展结点越少,效率远高于回溯。
- 最坏情况:无剪枝,和暴力搜索一致:
- 空间复杂度
- 最坏情况: 或 ,主要开销为优先队列存储活结点;
- 实际情况:剪枝越强,队列结点越少,空间越小;分支限界空间通常高于回溯法。
Ch 7. 随机化算法
一、整体概述
- 前面所学分治、动态规划、贪心、回溯、分支限界均为确定性算法:相同输入→相同执行步骤+相同输出。
- 随机化算法引入随机选择,牺牲部分确定性,换取更高平均效率,甚至解决确定性算法难以处理的问题。
- 应用领域:密码学、大数据、机器学习、分布式系统。
二、核心概念
1. 随机化算法定义
随机化算法可看作带两组输入的确定性算法:
- 常规问题输入
- 随机比特串 (随机数生成,多项式长度) 同一输入,输出随随机串变化;概率特性仅由决定。
2. 两大核心分类
(1)拉斯维加斯(Las Vegas)算法
核心特点:零错误,运行时间随机
- 正确性:输出100%正确,
- 运行时间:随机变量,期望运行时间有界
- 优化方式:多次运行可降低最坏耗时
- 典型例题:随机化快速排序、随机化快速选择
(2)蒙特卡洛(Monte Carlo)算法
核心特点:运行时间确定,结果存在有界错误
- 错误率:错误概率严格小于给定阈值,
- 运行时间:固定,不会超时
- 优化方式:多次执行,错误概率指数级下降
- 典型例题:蒙特卡洛求圆周率π
考试必考题:区分两种随机算法的特性、举例。
3. 随机数生成
计算机使用两类随机数:
-
伪随机数(PRNG)
- 本质:确定性函数,依靠种子生成序列,可复现结果
- 常用算法:线性同余LCG、梅森旋转MT19937、Xorshift
- 优缺点:速度快、可复现;非真随机,不适用高安全密码场景
- 工具:Python
random库,random.seed()设置种子
-
真随机数
- 来源:物理随机现象(鼠标、键盘、CPU温度、放射性衰变、量子效应)
- 优缺点:真正随机、安全性高;生成慢、成本高
- 适用:密码学、金融等高安全场景
三、三大经典案例
案例1:随机化快速排序(拉斯维加斯算法)
1. 改进思路
确定性快排缺陷:固定选首/尾元素为主元,有序数组下复杂度退化至 。 核心优化:每次在当前子数组中随机选主元,打破最坏输入场景。
2. 执行流程
- 随机选取区间内主元下标,将主元交换到区间最右侧;
- 执行标准快排分区;
- 递归排序左右子区间。
3. 复杂度分析
- 期望时间复杂度:(无论输入形态,稳定)
- 最坏时间复杂度:,发生概率极低,几乎可忽略
- 空间复杂度:期望 (递归栈),最坏 (概率极低)
- 实际性能:常数因子小,工程中最快排序之一。
4. 代码要点
核心函数:random_select(随机选主元)、partition(分区,与普通快排一致)、递归主体。
案例2:随机化快速选择(拉斯维加斯算法)
1. 问题
在无序数组中找第k小元素,目标:比排序()更快。
2. 算法思想
基于随机主元+分治,不完整排序,仅递归处理目标元素所在分支:
- 随机选主元、分区;
- 设左区间(≤主元)元素个数为:
- :主元就是第k小元素,直接返回;
- :目标在左区间,递归左半;
- :目标在右区间,递归右半,查找第 小。
3. 复杂度
- 期望时间复杂度:(线性时间,核心优势)
- 最坏时间复杂度:(低概率)
- 空间复杂度:(递归栈)
案例3:蒙特卡洛法求π
1. 数学原理(简答/计算题)
几何概率模型:
- 边长为2的正方形,面积 ;内部单位圆半径,面积
- 概率关系:
- 推导公式:
2. 执行步骤
- 生成 组随机坐标 ,;
- 判断点是否在单位圆内:,统计圆内点数;
- 代入公式估算。
3. 复杂度与精度
- 时间复杂度:(与投点数量线性相关)
- 空间复杂度:(常数空间)
- 精度规律:误差与 成正比;误差减半,投点数需扩大4倍。
Ch 8. 遗传算法
一、整体定位
- 算法归属:遗传算法(GA)属于进化计算、随机化搜索优化算法,灵感来自达尔文自然选择、孟德尔遗传定律。
- 适用场景(高频考点) 针对NP难问题、搜索空间极大、约束复杂的大规模优化问题;传统确定性算法(分治、动态规划、贪心、分支限界)在这类问题上效率极低甚至无法求解。
- 传统算法 VS 遗传算法
| 对比维度 | 传统优化算法(梯度下降、DP) | 遗传算法 |
|---|---|---|
| 搜索方式 | 单点出发,单向搜索 | 种群并行多点搜索 |
| 最优解 | 凸问题可保证全局最优 | 不保证全局最优,大概率得到近似最优 |
| 数学要求 | 需函数可导、有明确数学模型 | 无需可导,仅需适应度函数 |
| 适用场景 | 小规模、凸优化 | 大规模、NP难、多约束问题 |
| 核心优势 | 精度高、收敛快 | 鲁棒性强、通用性好 |
通俗记忆: 传统算法=单打独斗;遗传算法=群体作战。
二、核心概念与生物映射
1. 遗传算法定义
遗传算法是模拟生物自然选择、遗传变异的随机优化算法,将解编码为染色体,通过选择、交叉、变异三大核心操作迭代寻优。
2. 生物学 ↔ 算法概念映射
| 生物学概念 | 算法对应概念 | 含义 |
|---|---|---|
| 个体 | 候选解 | 问题的一个可行解 |
| 染色体 | 解的编码 | 解的表示形式(二进制/实数/排列) |
| 基因 | 编码基本单元 | 染色体中的最小元素 |
| 种群 | 解的集合 | 一组候选解 |
| 适应度 | 解的评价指标 | 数值越大,解质量越好 |
| 选择 | 优胜劣汰 | 挑选优质个体繁殖 |
| 交叉 | 基因重组 | 父代交换基因生成子代 |
| 变异 | 基因突变 | 随机改变基因,增加多样性 |
| 进化 | 迭代优化 | 种群逐代更新,解持续优化 |
三、标准执行流程
完整7步流程,考试要求能默写/简述:
- 问题定义:确定解空间、设计适应度函数
- 编码设计:把解转换成染色体(编码)
- 初始化种群:随机生成指定规模的初始个体集合
- 计算适应度:评价每一个体好坏
- 终止判断:达到最大迭代次数/适应度收敛 → 输出最优解;否则继续
- 三大遗传操作:选择 → 交叉 → 变异
- 生成新一代种群(常用精英保留策略),返回第4步循环
四、三大核心操作
1. 选择操作(优胜劣汰)
作用:优先选择适应度高的个体进入交配池,传递优良基因。
三种经典实现:
-
轮盘赌选择(公式必考)
个体被选中概率:
特点:概率与适应度成正比。
-
锦标赛选择(工程常用)
随机选个个体,取适应度最高者;鲁棒性强。
-
精英保留策略(必背)
将当代最优的若干个体直接复制到下一代,防止最优解丢失。
2. 交叉操作(基因重组)
作用:组合父代优良基因,产生新个体。
- 二进制编码:单点交叉、多点交叉、均匀交叉
- 排列编码(TSP问题):顺序交叉(保证城市不重复,合法路径)
3. 变异操作(基因突变)
作用:增加种群多样性,避免算法陷入局部最优。
- 二进制编码:位翻转变异(0↔1)
- 实数编码:均匀变异、高斯变异
- 排列编码(TSP):交换变异(随机交换两个基因位置)
五、算法参数与取值
| 参数 | 含义 | 推荐取值 | 说明 |
|---|---|---|---|
| 变异概率 | ,常用(为染色体长度) | 概率不能过高,否则破坏优良解 | |
| 交叉概率 | 0.8~0.9 | 取值偏高,保证基因重组 | |
| 最大迭代代数 | 100~10000 | 复杂度高则增大,可提前终止 | |
| 精英个体数 | 1~5 | 过多会降低种群多样性 | |
| 种群规模 | 根据问题设定(案例取100、200) | 规模太小易早熟,太大速度慢 |
六、算法常见问题及解决方案
-
过早收敛
现象:未找到全局最优就陷入局部最优,个体高度相似。
解决:增大种群、提高变异概率、改用锦标赛选择、小生境技术。
-
收敛速度慢
现象:迭代多代,适应度提升极慢。
解决:优化适应度函数、调整交叉/变异概率、启用精英保留、优化编码。
-
种群多样性丧失
现象:个体趋同,失去进化能力。
解决:提高变异概率、随机移民策略、适应度共享。
七、两大经典案例(综合题、计算题核心,考试重点)
案例1:0-1背包问题(二进制编码)
1. 算法设计
- 编码:二进制串,长度=物品数;位=1表示选该物品,0表示不选。
- 适应度函数
- 总重量 ≤ 背包承重:适应度 = 物品总价值
- 总重量 > 背包承重:适应度 = 0(惩罚非法解)
- 操作配置:锦标赛选择、单点交叉、位翻转变异、精英保留。
2. 复杂度分析(计算题考点)
- 单代时间复杂度: (种群规模,物品数)
- 总时间复杂度:(迭代次数)
- 空间复杂度:
- 对比优势:遗传算法复杂度和背包载重无关,适合超大载重场景(动态规划在极大时失效)。
案例2:旅行商问题 TSP(排列编码)
1. 算法设计
- 编码:整数排列,每个数字代表城市,每个城市仅出现一次。
- 适应度函数:总路程倒数(最小化问题转化为最大化适应度,路程越短,适应度越高)。
- 专属操作:顺序交叉、交换变异(保证排列合法,无重复城市)。
2. 复杂度
时间、空间复杂度和0-1背包一致:、。
Ch 9. 模拟退火算法
一、整体概述
1. 算法来源与本质
- 灵感来源:冶金学金属退火——高温加热、缓慢冷却,原子趋于能量最低的稳定晶体状态。
- 算法定义:基于蒙特卡洛迭代的随机化全局优化算法;单点迭代搜索,允许以一定概率接受较差解,从而跳出局部最优,最终逼近全局最优。
- 应用场景:旅行商TSP、0-1背包、车间调度、芯片设计、神经网络训练等组合优化问题。
2. 模拟退火 VS 遗传算法
| 对比维度 | 遗传算法 | 模拟退火算法 |
|---|---|---|
| 搜索方式 | 群体搜索(多个个体) | 单点搜索(单个解迭代) |
| 跳出局部最优 | 交叉、变异产生新个体 | 按概率接受坏解 |
| 收敛性 | 不保证全局最优 | 满足条件时理论收敛到全局最优 |
| 参数数量 | 参数多 | 参数少 |
| 实现难度 | 中等 | 简单 |
| 优缺点 | 并行强、易早熟收敛 | 全局搜索强、速度偏慢 |
通俗记忆:遗传算法=一群人找路;模拟退火=一个人摸索,偶尔走弯路找全局最优。
二、物理退火 ↔ 模拟退火 映射关系
理解算法的底层逻辑,考试常考对应关系:
| 物理退火 | 模拟退火算法 | 说明 |
|---|---|---|
| 原子状态 | 问题的解 | 候选答案 |
| 能量 | 目标函数值 | 值越小,解越优 |
| 温度 | 控制参数 | 决定接受坏解的概率,温度越高,容错性越强 |
| 加热 | 初始化高温 | 前期大范围搜索 |
| 等温过程 | 同一温度下多次迭代(马尔可夫链) | 单温度下充分搜索 |
| 冷却 | 温度逐步下降 | 逐步降低接受坏解的概率 |
| 基态(最低能量) | 全局最优解 | 问题最终答案 |
三、模拟退火完整执行步骤
1. 通用算法步骤
设解空间,目标函数(默认求最小值;求最大值可对目标函数取负)
- 初始化:初始温度、初始解、最优解;
- 等温迭代(马尔可夫链,长度):循环次
- 对当前解随机扰动,生成新解;
- 计算目标函数差值 ;
- Metropolis准则判断是否接受新解;
- 若新解更优,更新全局最优解;
- 降温:按降温策略更新温度;
- 终止判断:温度低于终止温度或达到最大迭代,停止;
- 输出全局最优解。
2. 三大核心操作
(1)状态产生函数(生成新解)
对当前解做随机扰动,不同编码对应不同方式:
- 二进制编码(如0-1背包):位翻转
- 排列编码(如TSP旅行商):交换、插入
- 实数编码:高斯/均匀随机扰动
(2)状态接受函数:Metropolis准则
关键结论
- :新解更好,必定接受;
- :新解更差,概率 接受;
- 温度越高,接受坏解概率越大;
- 越大(新解越差),接受概率越小;
- 高温阶段大胆“走弯路”跳出局部最优;降温后逐渐收敛。
(3)温度更新函数(降温策略)
三种策略,区分特点与适用场景:
-
指数降温(最常用):,降温系数
特点:兼顾效率与收敛,工程首选。
-
线性降温:
特点:降温快,易陷入局部最优。
-
对数降温:
特点:理论保证全局收敛,但降温极慢,几乎不实际使用。
3. 核心参数
- :初始高温;:终止温度;
- :马尔可夫链长度(单温度下迭代次数);
- :降温系数。
四、两大经典案例
案例1:0-1 背包问题
1. 问题转化
原目标:最大化总价值 → 模拟退火求最小值,因此目标函数取负。
2. 约束处理:惩罚函数
对超重的不可行解施加惩罚:
惩罚系数取大数,保证不可行解函数值远大于可行解。
3. 编码与新解生成
- 编码:二进制串,
1选物品,0不选; - 扰动方式:随机翻转一位二进制位。
4. 复杂度
-
时间复杂度:
:温度迭代次数,:马尔可夫链长度,:物品数量
-
空间复杂度:(仅存储解向量)
案例2:旅行商问题 TSP
1. 编码与新解生成
- 编码:城市排列(每个城市出现且仅出现一次);
- 扰动方式:随机交换两个位置的城市,保证解合法。
2. 目标函数
路线总路程,直接求最小值,无需取负。
3. 解题流程核心逻辑
随机初始路线 → 交换生成新路线 → Metropolis准则判接受 → 降温迭代 → 输出最短路径。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
部分内容可能已过时