多线程图划分
目的
利用多线程来完成图划分,从而达到提高效率的作用。
定义
balance:
balance 是用来衡量 k 划分有多么的平等的。
balance 定义为 k * max_i{η(V_i)/η(V)},其中 η(A)是 A 集合中的点的权重之和。balance 接近一表明划分非常的平均,当值大于 1 的时候,说明有更好的划分方式。
给定用户提供的一个 ε,我们定义一个 k 划分问题为划分图为最小的 edgecut 且 balance 不超过 1 + ε
多层次图划分
依旧分为:
coarsening,initial partitioning,uncoarsening。
有算法 KMetis,ParMetis
KMetis
Kmetis 将图存储在类似于用于稀疏矩阵的压缩的稀疏的行格式的结构里面,以及用了额外的向量,包括一个存储顶点权重的向量,一个 partition 向量 P,一个 vertex mapping(点映射)向量 C。
coarsening
在 Kmetis 的粗化阶段中包含两个部分:匹配(matching)和收缩(contraction)。匹配就是 C i C_i Ci 产生于 G i G_i Gi 图的 vertex mapping 向量,而收缩就是产生了图 G i + 1 G_{i+1} Gi+1(来源于 C i C_i Ci 和 G i G_i Gi)。
matching 阶段:
我们用一个 matching 向量 M 开始,来生成 C。如果两个点 v 和 u,在 M 中有相应的项,则它们匹配,比如 M v = u M^v=u Mv=u 以及 M u = v M^u=v Mu=v(就是 M[u] = v 以及 M[v] = u,则 u 和 v 匹配了)。他们也同样映射于相同的一个粗化节点 c = C i v = C i u c=C^v_i=C^u_i c=Civ=Ciu (i 表示第几个图的 vertex mapping 向量 C,即 C i C_i Ci 这一向量中的 C i C_i Ci[v]= C i C_i Ci[u],表示 v 和 u 将在下一个图中合并为一个粗化节点)
根据点的权重的升序来遍历他们,相同权重的则以随机顺序遍历(来鼓励探索在多次运行中找到解决的空间?)。如果一个点 v 已经被 match 过了,那么他被跳过。如果他没被 match 那么找该点(v)的邻居中与 v 有权重最高的边的且没被 match 的邻接点 u,然后将 u 和 v 记录在 matching vector M 中,即 M v = u M^v=u Mv=u 以及 M u = v M^u=v Mu=