Page 109 - 《软件学报》2026年第3期
P. 109

1072                                                       软件学报  2026  年第  37  卷第  3  期



                 1. begin
                 2. M ← mapping of vertex IDs to previous partition IDs
                 3. P = [P 0 ,...,P n−1 ] ← [∅ for i in 0..n−1]  //清空原本的布局
                 4. foreach v in V
                 5.    x ← M [v]                           //尝试分配至原布局位置
                      while x < n and P x is full then x ← x+1
                 6.
                      if x = n then x ← any free partition
                 7.
                 8.    P x ← P x ∪v
                      foreach u ∈ IN (v)
                 9.
                        y ← max(M [u], x)                  //尝试分配邻居至原布局位置
                 10.
                        while y < n and P y is full then y ← y+1
                 11.
                 12.     if y = n then y ← any free partition
                 13.     P y ← P y ∪u
                 14.    endfor
                 15 endfor
                 16. end

                    (3) 分配算法   C: 基于邻居频率启发式的收敛分配算法
                    在分配算法     B  的布局基础上, 本文再提出基于邻居频率启发式的收敛优化算法, 期望在尽量不破坏分配算法
                 B  的先后顺序基础上, 进一步加强松弛化条件, 具体流程如算法                  7  所示: 给定迭代轮数    β 与已有布局 (第    2–4  行),
                 按照随机顺序访问所有点 (第         5  行), 当访问点   p 时, 统计其邻接出边点所在分区号的最大值            PID direct  与邻接入边点
                                 PID reverse  (第  6、7
                 所在分区号的最小值                     行), 如果  PID direct  小于等于  PID reverse , 则当前访问点  p 可以取到局部最优解,
                                         PID reverse  之间的最小分区上 (第  9、10                          PID direct  之
                 也就是把点    p 分配到  PID direct  与                         行); 否则, 把点分配到    PID reverse  与
                 间权重最大值分区上 (第       11–21  行), 权重值为当前分区及以后的入边邻居数与当前分区及以前的出边邻居数之和
                 (第  13–16  行).
                 算法  7. 基于启发式的收敛分配算法.

                 输入: 图G = (V,N (V)), 迭代轮数β;
                 输出: 新布局P.
                 1. begin
                 2. M ← mapping of vertex IDs to previous partition IDs
                 3. P = [P 0 ,...,P n−1 ] ← [∅ for i in 0..n−1]  //清空原本的布局
                 4. while iteration ⩽ β
                 5.    foreach v in V
                 6.     PID direct ← max partition ID in direct neighbors
                 7.     PID reverse ← min partition ID in reverse neighbors
                 8.     x ← −1
                 9.     if PID direct ⩽ PID reverse
                 10.      x ← ID of smallest partition ∈ [P PID direct  ,P PID reverse ]
                 11.     else
                 12.      W max ← −1
                 13.      for i ← PID reverse to PID direct
   104   105   106   107   108   109   110   111   112   113   114