该文档涉及的组件

单源最短路径 (SingleSourceShortestPathBatchOp)

Java 类名:com.alibaba.alink.operator.batch.graph.SingleSourceShortestPathBatchOp

Python 类名:SingleSourceShortestPathBatchOp

功能介绍

对于给定的图以及给定的单个源点,求给定点到图中所有点的最短路径。如果某点与源点不相连,输出的距离为长整型可取到的最大值。

单源最短路径的应用场景有网络设计、路径规划等。

参数说明

名称 中文名称 描述 类型 是否必须? 取值范围 默认值
edgeSourceCol 边表中起点所在列 边表中起点所在列 String
edgeTargetCol 边表中终点所在列 边表中终点所在列 String
sourcePoint 源点的值 源点的值 String
asUndirectedGraph 是否为无向图 是否为无向图 Boolean true
edgeWeightCol 边权重列 表示边权重的列 String null
maxIter 最大迭代次数 最大迭代次数 Integer x >= 1 50

代码示例

Python 代码

from pyalink.alink import *

import pandas as pd

useLocalEnv(1)

df = pd.DataFrame([[1, 2],\
[2, 3],\
[3, 4],\
[4, 5],\
[5, 6],\
[6, 7],\
[7, 8],\
[8, 9],\
[9, 6]])

data = BatchOperator.fromDataframe(df, schemaStr="source double, target double")
SingleSourceShortestPathBatchOp()\
    .setEdgeSourceCol("source")\
    .setEdgeTargetCol("target")\
    .setSourcePoint("1")\
    .linkFrom(data)\
    .print()

Java 代码

import org.apache.flink.types.Row;

import com.alibaba.alink.operator.batch.BatchOperator;
import com.alibaba.alink.operator.batch.source.MemSourceBatchOp;
import com.alibaba.alink.testutil.AlinkTestBase;
import org.junit.Test;

public class SingleSourceShortestPathBatchOpTest extends AlinkTestBase {

    @Test
    public void test() throws Exception {
        Row[] rows = new Row[]{
            Row.of(1, 2, 1.0),
            Row.of(2, 3, 1.0),
            Row.of(3, 4, 1.0),
            Row.of(4, 5, 1.0),
            Row.of(5, 6, 1.0),
            Row.of(6, 7, 1.0),
            Row.of(7, 8, 1.0),
            Row.of(8, 9, 1.0),
            Row.of(9, 6, 1.0)
        };
        BatchOperator inData = new MemSourceBatchOp(rows, new String[]{"source", "target", "weight"});
        SingleSourceShortestPathBatchOp op = new SingleSourceShortestPathBatchOp()
            .setEdgeSourceCol("source")
            .setEdgeTargetCol("target")
            .setSourcePoint("1");

        BatchOperator res = op.linkFrom(inData);
        res.print();
    }
}

运行结果

vertex distance
1 0.0000
2 1.0000
5 4.0000
9 6.0000
4 3.0000
3 2.0000
8 7.0000
6 5.0000
7 6.0000