metis 多线程图划分论文笔记

多线程图划分目的利用多线程来完成图划分,从而达到提高效率的作用。定义balance:balance 是用来衡量 k 划分有多么的平等的。balance 定义为 k * max_i{η(V_i)/η(V)},其中 η(A)是 A 集合中的点的权重之和。balance 接近一表明划分非常的平均,当值大于 1 的时候,说明有更好的划分方式。给定用户提供的一个 ε,我们定义一个 k 划分问题为划分图为最小的 edgecut 且 balance 不超过 1 + ε多层次图划分依旧分为:coar
摘要由CSDN通过智能技术生成

多线程图划分

目的

利用多线程来完成图划分,从而达到提高效率的作用。

定义

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=

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Metis是一个开源的划分工具,可以用于将大型划分成多个子,以便并行处理或者分布式计算。C++语言可以基于Metis库实现划分,具体步骤如下: 1. 安装Metis库,并在C++编译环境中配置Metis库路径。 2. 读取数据,将数据转换成Metis所要求的格式,例如CSR(Compressed Sparse Row)格式。 3. 调用Metis库提供的函数进行划分,例如METIS_PartGraphKway函数,该函数将划分成k个子,其中k为用户指定的参数。 4. 将划分结果保存到文件中或者直接使用内存中的数据。 下面是一个简单的C++代码示例,实现了基于Metis库的划分: ```c++ #include <metis.h> #include <iostream> #include <fstream> #include <vector> using namespace std; int main() { // 读取数据 int nvertices, nedges; ifstream fin("input.txt"); fin >> nvertices >> nedges; vector<int> xadj(nvertices + 1), adjncy(nedges); for (int i = 0; i <= nvertices; i++) fin >> xadj[i]; for (int i = 0; i < nedges; i++) fin >> adjncy[i]; fin.close(); // 调用Metis库进行划分 int nparts = 4; // 划分成4个子 vector<int> part(nvertices); int ret = METIS_PartGraphKway(&nvertices, &nparts, xadj.data(), adjncy.data(), NULL, NULL, NULL, &nparts, NULL, NULL, NULL, &part[0]); // 输出划分结果 if (ret == METIS_OK) { ofstream fout("output.txt"); for (int i = 0; i < nvertices; i++) fout << part[i] << endl; fout.close(); } else { cout << "Graph partitioning failed." << endl; } return 0; } ``` 在上面的代码中,我们首先读取了数据,然后调用了METIS_PartGraphKway函数进行划分,并将划分结果保存到了文件中。在实际应用中,可以根据需要对代码进行修改和优化,以得到更好的划分效果。 ### 回答2: C语言基于metis实现划分的步骤如下: 1. 引入头文件:在C程序的开头添加#include <metis.h>来引入metis库的头文件。 2. 创建对象:使用metis库提供的函数METIS_CreateGraph创建一个对象。参数包括的总节点数、的总边数、xadj数组和adjncy数组,分别表示节点之间的连接关系。 3. 设置分割的选项:使用metis库提供的函数METIS_SetDefaultOptions来设置默认的分割选项。也可以通过修改metis库提供的Options结构体的成员来自定义分割的选项。 4. 执行分割:使用metis库提供的函数METIS_PartGraphKway来执行的分割。参数包括对象、希望分割成的部分数目、使用的算法METIS_PartGraphRecursive或METIS_PartGraphKway),以及一个可选的连续数值的数组(可用于指定初始分区)。 5. 处理分割的结果:metis库会将对象的分割结果存储在一个编号数组中(即part数组)。根据part数组的元素,可以将的节点分成不同的部分。 6. 释放资源:在程序结束前,使用metis库提供的函数METIS_FreeGraph来释放对象所占用的资源。 总结:通过使用metis库提供的函数,我们可以很方便地在C语言中实现划分。只需引入metis库的头文件、创建对象、设置分割选项、执行分割以及处理分割结果即可实现划分。 ### 回答3: 基于metis实现划分指的是使用metis算法进行划分metis是一种常用的划分工具,通过划分后的可以在多个计算资源上并行处理,从而提高计算效率和并行性。 metis算法主要包含以下几个步骤: 1. 预处理:首先,需要将原始数据转换为metis可以处理的格式,通常是将表示为一个邻接矩阵或邻接表结构。 2. 划分参数设置:决定划分的质量和结果的平衡性等参数,如权重、边的限制等。这些参数可以通过调整来获得最佳的划分结果。 3. 划分算法执行:metis使用一种称为多级划分的方法。它将原始划分为多个较小的子,然后逐级对子进行划分,直到达到所需的划分数量或划分质量。 4. 划分结果评估:metis根据一定的评估标准对划分结果进行评估,包括划分质量、平衡性等指标。可以根据评估结果来调整划分参数和算法选择。 通过metis实现划分可以获得多个子,每个子都包含部分节点和边。这些子可以在并行计算中使用,每个计算资源可以独立处理一个子,从而提高计算效率和并行性。 总结来说,基于metis实现划分可以通过预处理、参数设置、算法执行和结果评估等步骤来实现。这样可以将原始划分为多个子,以提高计算效率和并行性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值