Pregel实例
一、单源最短路径--可用于交通图中两点间最短路线任务,如某个中间节点瘫痪,需要计算最新路网图中两点最短路径

单源指只有一个源顶点,单源最短路径输入图中图的关联值就是源顶点到当前顶点的最短路径。
Pregel非常适合用来解决单源最短路径问题,实现代码如下:
1 class ShortestPathVertex
2 : public Vertex<int, int, int> {
3 void Compute(MessageIterator* msgs) { //msgs消息队列中保存上一个超步中其他顶点发送给当前顶点的消息
4 int mindist = IsSource(vertex_id()) ? 0 : INF; //判断当前顶点是否源顶点(有向图都有源顶点)。mindist是最短路径,INF是无穷大。
5 for (; !msgs->Done(); msgs->Next())
6 mindist = min(mindist, msgs->Value()); //每个消息内容即msgs->Value()表示从源顶点到当前顶点的最短路径。消息循环处理结束mindist 就是源顶点到当前顶点最短路径
7 if (mindist < GetValue()) { //GetValue()是当前顶点的关联值,就是源顶点到当前顶点的最短路径。
8 *MutableValue() = mindist; //修改当前顶点关联值
9 OutEdgeIterator iter = GetOutEdgeIterator(); //获取出射边对象容器
10 for (; !iter.Done(); iter.Next())
11 SendMessageTo(iter.Target(),
12 mindist + iter.GetValue()); //沿着每个出射边发送消息给目标顶点,消息值就是源顶点到当前顶点的最短路径+出射边关联值
13 } //endif
14 VoteToHalt(); //计算处理完,消息发送完后本顶点状态设置为非活跃
15 } //end oid Compute
16 }; //end class ShortestPathVertex



超步1:
顶点0:没有收到消息,依然非活跃
顶点1:收到消息100(唯一消息),被显式唤醒,执行计算,mindist变为100,小于顶点值INF,顶点值修改为100,没有出射边,不需要发送消息,最后变为非活跃
顶点2:收到消息30,被显式唤醒,执行计算, mindist变为30,小于顶点值INF,顶点值修改为30,有两条出射边,向顶点3发送消息90(即:30+60),向顶点1发送消息90(即:30+60),最后变为非活跃
顶点3:没有收到消息,依然非活跃
顶点4:收到消息10,被显式唤醒,执行计算, mindist变为10,小于顶点值INF,顶点值修改为10,向顶点3发送消息60(即:10+50),最后变为非活跃
浙公网安备 33010602011771号