TuGraph Analytics图计算快速上手之弱联通分量算法

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,1000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: TuGraph Analytics是蚂蚁集团近期开源的分布式流式图计算,目前广泛应用在蚂蚁集团的金融、社交、风控等诸多领域。

作者:张奇

TuGraph Analytics简介

TuGraph Analytics是蚂蚁集团近期开源的分布式流式图计算,目前广泛应用在蚂蚁集团的金融、社交、风控等诸多领域。更多详细内容可参考TuGraph Analytics的github首页(https://github.com/TuGraph-family/tugraph-analytics),欢迎国内外开发者们与我们共建TuGraph Analytics社区,壮大流图产业生态。

弱联通分量算法介绍

弱联通分量图算法(Weakly Connected Components Algorithm)是一种用于找到图中所有弱联通分量的算法。弱联通分量是指在有向图中,如果忽略所有边的方向,相互之间是连通的节点集合。

算法的基本思想是通过深度优先搜索(DFS)或广度优先搜索(BFS)遍历图的所有节点,对于每个未访问过的节点,都会生成一个新的联通分量。在遍历过程中,如果当前节点的邻居节点已经被访问过,那么将其加入当前联通分量中,并继续遍历邻居节点。

通过这种方式,算法能够找到图中所有弱联通分量,并将每个分量的节点集合进行标记或存储起来。最终,算法返回所有弱联通分量的集合。

弱联通分量图算法可以应用于许多实际问题,例如社交网络分析中的用户群体划分、网页链接分析中的网页群组划分等。它能够帮助我们理解图中不同分量之间的关系,从而更好地分析图的结构和特性。

1.png

在TuGraph Analytics上实现弱联通分量算法

使用方式

用户可以在GQL图查询语句中嵌入图算法,如下所示:

INSERT INTO tbl_result
CALL wcc() YIELD (vid, component)
RETURN vid, component
;

通过CALL语句调用具体的算法,通过YIELD定义算法的返回字段。需要注意的是,这么做的前提是算法udf需要注册或者创建后才能使用。DSL内置算法或者UDF在BuildInSqlFunctionTable中进行注册。对于非内置算法,可以通过create function语句来创建。

Create funciton wcc as 'com.antgroup.geaflow.dsl.udf.graph.WeakConnectedComponents';

算法实现

TuGraph Analytics上实现图算法需要实现AlgorithmUserFunction接口,该接口定义如下:

public interface AlgorithmUserFunction<K, M> extends Serializable {

    /**
     * Init method for the function.
     * @param context The runtime context.
     * @param params  The parameters for the function.
     */
    void init(AlgorithmRuntimeContext<K, M> context, Object[] params);

    /**
     * Processing method for each vertex and the messages it received.
     */
    void process(RowVertex vertex, Iterator<M> messages);

    /**
     * Finish method called by each vertex upon algorithm convergence.
     */
    void finish(RowVertex vertex);

    /**
     * Returns the output type for the function.
     */
    StructType getOutputType();
}

init

首先,init方法在worker初始化时调用,用户往算法udf中传入的参数,会放在params数组变量里。比如wcc(10),这里的params[0] = 10。

public void init(AlgorithmRuntimeContext<Object, String> context, Object[] parameters) {
    this.context = context;
    if (parameters.length > 2) {
        throw new IllegalArgumentException(
            Only support zero or more arguments, false arguments "
                + "usage: func([alpha, [convergence, [max_iteration]]])");
    }
    // 设置最大迭代次数,如果没有设置该参数,最大迭代次数默认为20
    if (parameters.length > 0) {
        iteration = Integer.parseInt(String.valueOf(parameters[0]));
    }
    // 设置输出结果联通分量的key,默认为"component"
    if (parameters.length > 1) {
        keyFieldName =String.valueOf(parameters[1]);
    }
}

process

process方法是每轮迭代执行的核心方法,弱联通分量算法的核心逻辑就实现在该方法里。在这里,第一轮迭代时我们设置每个点的value初始值为该点的id,然后将该id通过出边和入边向其邻居节点传递出去。在此后的每轮迭代里,每个收到邻居节点消息的节点会取出消息里的最小值,作为该节点的新值,然后再将该最小值传递给其他邻居节点。到最后,所有联通分量的节点的值都会被染色成这个联通网络里的节点最小值。

public void process(RowVertex vertex, Iterator<String> messages) {
    List<RowEdge> edges = new ArrayList<>(context.loadEdges(EdgeDirection.BOTH));
    if (context.getCurrentIterationId() == 1L) {
        String initValue = String.valueOf(vertex.getId());
        sendMessageToNeighbors(edges, initValue);
        context.sendMessage(vertex.getId(), String.valueOf(vertex.getId()));
        context.updateVertexValue(ObjectRow.create(initValue));
    } else if (context.getCurrentIterationId() < iteration) {
        String minComponent = messages.next();
        while (messages.hasNext()) {
            String next = messages.next();
            if (next.compareTo(minComponent) < 0) {
                minComponent = next;
            }
        }
        sendMessageToNeighbors(edges, minComponent);
        context.sendMessage(vertex.getId(), minComponent);
        context.updateVertexValue(ObjectRow.create(minComponent));
    }
}

private void sendMessageToNeighbors(List<RowEdge> edges, String message) {
    for (RowEdge rowEdge : edges) {
        context.sendMessage(rowEdge.getTargetId(), message);
    }
}

finish

finish方法在迭代最终收敛时会被调用,此时每个节点都会被染色成了它所在联通网络里的节点最小值,我们可以将结果输出。

public void finish(RowVertex vertex) {
    String component = (String) vertex.getValue().getField(0, StringType.INSTANCE);
    context.take(ObjectRow.create(vertex.getId(), component));
}

getOutputType

getOutputType方法中返回udf输出结果的schema,在这里我们的输出结果是点,点有meta字段id和属性字段component。

public StructType getOutputType() {
    return new StructType(
        new TableField("id", LongType.INSTANCE, false),
        new TableField(keyFieldName, StringType.INSTANCE, false)
    );
}

总结

在本篇文章中我们介绍了如何在TuGraph Analytics上实现弱联通分量算法,如果你觉得比较有趣,欢迎关注我们的社区(https://github.com/TuGraph-family/tugraph-analytics)。开源不易,如果你觉得还不错,可以给我们star支持一下~

相关文章
|
2月前
|
算法 机器人
基于SOA海鸥优化算法的PID控制器最优控制参数计算matlab仿真
本课题研究基于海鸥优化算法(SOA)优化PID控制器参数的方法,通过MATLAB仿真对比传统PID控制效果。利用SOA算法优化PID的kp、ki、kd参数,以积分绝对误差(IAE)为适应度函数,提升系统响应速度与稳定性。仿真结果表明,SOA优化的PID控制器在阶跃响应和误差控制方面均优于传统方法,具有更快的收敛速度和更强的全局寻优能力,适用于复杂系统的参数整定。
|
6月前
|
算法 JavaScript 数据安全/隐私保护
基于GA遗传优化的最优阈值计算认知异构网络(CHN)能量检测算法matlab仿真
本内容介绍了一种基于GA遗传优化的阈值计算方法在认知异构网络(CHN)中的应用。通过Matlab2022a实现算法,完整代码含中文注释与操作视频。能量检测算法用于感知主用户信号,其性能依赖检测阈值。传统固定阈值方法易受噪声影响,而GA算法通过模拟生物进化,在复杂环境中自动优化阈值,提高频谱感知准确性,增强CHN的通信效率与资源利用率。预览效果无水印,核心程序部分展示,适合研究频谱感知与优化算法的学者参考。
|
存储 分布式计算 算法
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
241 0
|
8月前
|
算法 数据安全/隐私保护
基于Big-Bang-Big-Crunch(BBBC)算法的目标函数最小值计算matlab仿真
该程序基于Big-Bang-Big-Crunch (BBBC)算法,在MATLAB2022A中实现目标函数最小值的计算与仿真。通过模拟宇宙大爆炸和大收缩过程,算法在解空间中搜索最优解。程序初始化随机解集,经过扩张和收缩阶段逐步逼近全局最优解,并记录每次迭代的最佳适应度。最终输出最佳解及其对应的目标函数最小值,并绘制收敛曲线展示优化过程。 核心代码实现了主循环、粒子位置更新、适应度评估及最优解更新等功能。程序运行后无水印,提供清晰的结果展示。
210 14
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
310 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
算法 C++
如何精确计算出一个算法的CPU运行时间?
如何精确计算出一个算法的CPU运行时间?
|
1月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
202 0
|
1月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
150 2
|
2月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
203 3

热门文章

最新文章