图技术
利用neo4j、networkx、dgl、python做图分析挖掘
【1】最短路径算法dijkstra
【2】基于networkx的隐性集团关系识别模型
【3】基于Neo4j的担保社群型态分析挖掘
【4】基于python求有向无环图中target到其他节点全路径
前言
随着人工智能的不断发展,图这门技术也越来越重要,很多人都开启了学习图技术,本文就介绍了图技术中的计算任意两点的路径。
一、任意两点的路径
如下图所示,求企业A与企业D的路径
二、使用步骤
1.图表示
图在python中,一般可以采用字典表示,如上图中可以表示为
graph = dict()
graph['A'] = ['B', 'C']
graph['B'] = ['C']
graph['C'] = ['D']
print(graph)
{'A': ['B', 'C'], 'B': ['C'], 'C': ['D']}
2.算法步骤
- 初始化,全部路径paths、单条路径path = [start];
- 广度遍历查找路径,
-
- 判断start是否在graph中:
-
-
- 如过不在图中,则结束;
-
-
- 判断单条路长是否超出阈值:
-
-
- 如果超出阈值,则结束;
-
-
- 遍历start的邻居节点:
-
-
- 判断起始节点是否在单条path出现:
-
-
-
-
- 如果没有则追加;
-
-
-
-
-
- 如果有,即出现环,则结束
-
-
-
-
- 如果单条path没有出现在paths里且满足终点等于target,则在结果中追加
-
-
-
- 以新的邻居节点dfs
-
三、代码表示
class Solution:
#graph表示一张图
#start表示起始节点
#target表示终止节点
#cut表示最大路长
def searchpaths(self, start, target, cut):
paths = []
path = []
#graph = {1:[2, 5], 2:[3, 4], 3:[4, 5], 5:[6]}
graph = {'A': ['B', 'C'], 'B': ['C'], 'C': ['D']}
def dfs(start, target):
#如果起始节点不在图中,则结束
if start not in graph:
return
#如果路长大于阈值,则结束
if len(path) >= cut:
return
#遍历起始节点的邻居节点
for neighbor in graph[start]:
#如果起始节点没有在单条path出现,则追加
if neighbor not in path:
path.append(neighbor)
#出现环,则结束
else:
return
#如果单条path没有出现在paths里且满足终点等于target,则在结果中追加
if path not in paths and path[-1] == target:
#拷贝
paths.append(path[:])
#以新的邻居节点dfs
dfs(neighbor, target)
#last的追加了neighbor,需要返回
path.pop()
path.append(start)
dfs(start, target)
return paths
print(Solution().searchpaths(start='A', target='D', cut=30))
[['A', 'B', 'C', 'D'], ['A', 'C', 'D']]
Process finished with exit code 0