目录
1.子图同构算法实现图的匹配
给你两个点集,如何判断两个点集是不是相同的,可以利用子图同构算法进行匹配。程序如下:
# -*- coding: utf-8 -*-
"""
Created on Thu Jun 1 11:24:23 2023
@author: whd
"""
import networkx as nx
# 创建第一个图
G1 = nx.Graph()
G1.add_edges_from([(1, 2), (1, 3), (2, 3), (3, 4)])
# 创建第二个图
G2 = nx.Graph()
#G2.add_edges_from([(10, 20), (10, 30), (20, 30), (30, 40)])
G2.add_edges_from([(30, 40),(10, 20), (20, 30), (10, 30)])
# 使用子图同构算法进行匹配
GM = nx.algorithms.isomorphism.GraphMatcher(G1, G2)
# 打印匹配结果
if GM.is_isomorphic():
print("图匹配成功!")
mapping = GM.mapping
print("匹配节点映射关系:", mapping)
else:
print("图匹配失败!")
- 所有点放大相同倍数,变换点的位置,都能完成匹配。【比如这里的将所有的点放到10倍或者100倍,或者调换任意结果点的位置,均能完成匹配】
- 但是将只要任何一个值,不是同比例的放大,比如最后一个值变为(10,31),则匹配失败。该算法完成的是硬性的匹配,对尺度变化和仿射均极度敏感。
2.利用点构建无向图
"""
Created on Thu Jun 1 11:17:50 2023
@author: whd
"""
import networkx as nx
import matplotlib.pyplot as plt
# 创建一个空的无向图
graph = nx.Graph()
# 添加节点
points = [(0, 5), (2, 10), (3, 6),(4,8)]
for i, point in enumerate(points):
graph.add_node(i, pos=point) # 将点坐标作为节点属性保存
# 添加边
# 这里可以根据需要定义边的连接关系,例如根据距离或其他几何条件来决定是否添加边
# 这里以连接所有节点为例,将所有节点两两之间都添加边
for i in range(len(points)):
for j in range(i + 1, len(points)):
graph.add_edge(i, j)
# 可视化图
pos = nx.get_node_attributes(graph, 'pos')
nx.draw(graph, pos=pos, with_labels=True, node_size=200)
plt.show()
效果如下: