分块矩阵的近似最小度(AMD)重排序算法
我将为您讲解分块矩阵的近似最小度(Approximate Minimum Degree, AMD)重排序算法。这是一种用于对称正定稀疏矩阵在Cholesky分解前进行行列重排序,以减少分解后非零元填充(fill-in)的高效算法。
题目描述
对于大型对称正定稀疏线性方程组 \(A x = b\),通常使用Cholesky分解 \(A = LL^T\) 进行求解。但在分解过程中,即使原始矩阵 \(A\) 很稀疏,其Cholesky因子 \(L\) 中也可能出现大量原始为零的新非零元,称为“填充”。填充会显著增加计算和存储成本。AMD算法通过对矩阵的行和列进行对称置换(即 \(PAP^T\)),使得重排序后的矩阵在Cholesky分解时产生的填充尽可能少,从而提高分解效率。该算法是“最小度(Minimum Degree)”算法的快速近似版本,广泛用于稀疏矩阵计算库中。
解题过程
步骤1:理解基本概念
- 对称重排序:由于A对称正定,我们进行对称置换,即用排列矩阵 \(P\) 得到 \(PAP^T\)。这保持了矩阵的对称性和正定性。
- 填充:在Cholesky分解过程中,如果存在指标 \(i, j, k\) 使得 \(l_{ik} \neq 0\) 且 \(l_{jk} \neq 0\),那么即使 \(a_{ij} = 0\),也可能在 \(L\) 中产生非零元 \(l_{ij} \neq 0\)。这个新增的非零元就是填充。
- 消去图(Elimination Graph):将对称矩阵 \(A\) 视为无向图 \(G=(V,E)\),其中顶点集 \(V = \{1,2,...,n\}\) 对应行/列,边 \((i,j) \in E\) 当且仅当 \(a_{ij} \neq 0\)(\(i \neq j\))。当消去顶点 \(k\)(即对第k列进行Cholesky消去)时,其所有邻居之间会形成新的边(称为“填充边”)。这个过程对应的图变换就是消去图。
步骤2:最小度算法的基本思想
最小度算法是一种贪心算法:
- 在消去图中,选择当前度数最小的顶点。
- 消去该顶点(即进行对应的Cholesky消去步),并更新图(添加填充边)。
- 重复直到所有顶点消去完毕。
顶点被选择的顺序即为所求的重排列顺序(反向顺序,即最后消去的顶点排在重排矩阵的前面)。
- 度数:指当前消去图中与该顶点相邻的顶点数。
- 选择度数最小的顶点是为了在消去时,产生的新边(填充)尽可能少。
步骤3:近似最小度(AMD)的改进
精确的最小度算法需要跟踪图更新,计算精确的度数,代价较高。AMD算法通过近似方法来提高效率:
- 边界度数(Bound Degree):不计算精确的度数,而是使用一个容易计算的边界值。对于顶点 \(i\),其边界度数 \(\text{bound}(i)\) 定义为:
\[ \text{bound}(i) = |\text{Adj}(i) \cup \{i\}| \]
其中 \(\text{Adj}(i)\) 是顶点 \(i\) 的邻居集。实际上,在消去过程中,\(\text{bound}(i)\) 是顶点 \(i\) 当前度数的一个上界。
2. 近似选择:选择具有最小边界度数的顶点进行消去。由于边界度数是上界,这个选择是近似最优的。
3. 聚合(Mass Elimination):当两个顶点 \(i\) 和 \(j\) 的邻接集几乎相同时(具体标准后述),可以将它们聚合在一起,作为一个“超顶点”处理,进一步减少计算量。
步骤4:AMD算法的详细步骤
设对称正定稀疏矩阵 \(A\) 的阶数为 \(n\)。
初始化:
- 构造初始图 \(G\)(从 \(A\) 的非零结构得到)。
- 对于每个顶点 \(i\),计算初始的边界度数 \(\text{bound}(i)\)。
- 将所有顶点放入一个优先队列(按边界度数排序)。
主循环(每次选择一个顶点消去):
- 选择顶点:从优先队列中弹出边界度数最小的顶点 \(k\)。
- 消去顶点 \(k\):
- 将顶点 \(k\) 标记为已消去。
- 对于每一对 \((i, j)\) 满足 \(i, j \in \text{Adj}(k)\) 且 \(i \neq j\),如果边 \((i,j)\) 不存在,则添加填充边。
- 更新受影响的顶点:
- 顶点 \(k\) 的所有邻居顶点 \(i \in \text{Adj}(k)\) 的邻接集会发生变化(增加了新的邻居)。
- 重新计算这些受影响顶点 \(i\) 的边界度数。
- 在优先队列中更新这些顶点的位置。
- 聚合检查(可选但关键):
- 如果顶点 \(i\) 的邻接集与顶点 \(k\) 的邻接集(在消去前)满足某种相似性条件(例如,\(\text{Adj}(i) \subseteq \text{Adj}(k) \cup \{k\}\)),那么顶点 \(i\) 可以与 \(k\) 聚合。这意味着 \(i\) 的度数不会因为 \(k\) 的消去而增加,可以立即将 \(i\) 标记为已消去(紧随 \(k\) 之后),而无需单独处理。这能显著减少计算量。
- 重复步骤1-4,直到所有顶点消去完毕。
输出:得到消去顺序的逆序,即为所求的排列 \(P\)。也就是说,最后消去的顶点对应重排矩阵的第一行/列,依此类推。
步骤5:算法实现中的关键数据结构
- 邻接表:存储每个顶点的邻居集合,用于快速查找和更新。
- 优先队列:通常使用斐波那契堆或配对堆,支持快速删除最小元素和减少关键字操作。
- 填充边记录:在添加填充边时,需要更新相关顶点的邻接表。
步骤6:复杂度与特点
- 时间复杂度:近似为 \(O(|E|)\),即与初始图的边数成线性关系,远低于精确最小度算法。
- 空间复杂度:与存储图结构所需的空间相当。
- 近似性:由于使用边界度数和聚合,得到的是近似最小填充顺序,但在实际应用中效果很好,尤其是对于来自有限元、差分等结构化问题的矩阵。
- 广泛应用:是许多稀疏矩阵求解器(如SuiteSparse、PARDISO)中的默认或可选重排序方法。
总结
AMD算法通过近似度数和顶点聚合技术,高效地生成一种能大幅减少Cholesky分解填充的对称重排序。它结合了贪心策略的直观性和近似方法的高效性,是处理大型对称正定稀疏矩阵的重要预处理工具。理解AMD算法有助于深入掌握稀疏矩阵计算中减少填充的核心思想和技术。