Reference
算法流程图
注意:基本原理方法在文章中有详细介绍
使用该文章的方法,实现一个图形相似度的计算,完成模式识别
import numpy as np
class Cycle(object):
def __init__(self, N, E, S):
self.N = N # 元素数量
# [['类型', '连接方式', '尺寸约束'], ['类型', '连接方式', '尺寸约束'], ['类型', '连接方式', '尺寸约束']...]
self.E = E
self.S = S # 对称性
def __str__(self):
return 'N={}\nE={}\nS={}\n'.format(self.N, self.E, self.S)
__repr__ = __str__
# 几何元素类型的相似系数
def type_coeff(o1, o2):
if o1 == o2:
return 1
return 0.25
# 几何元素的连接方式的相似系数
def method_coeff(o1, o2):
if o1 == o2:
return 1
if o1 in (0,6) and o2 in (0,6):
return 0.75
if o1 in (0,6) and o2 in (1,2,5) or o2 in (0,6) and o1 in (1,2,5):
return 0.5
return 0
# if o1 in [0,1,2,6] and o2 in [3,4] or o2 in [0,1,2,6] and o1 in [3,4]:
# return 0
# return 0
# a = method_coeff(1, 1)
# print(a)
# 几何元素的尺寸约束状况的相似系数
def size_coeff(o1, o2):
if o1 == o2:
return 1
if o1 in (2,3) and o2 in (2,3):
return 0.75
return 0
# if o1 in (2,3) and o2 in (1,4,5) or o2 in (2,3) and o1 in (1,4,5):
# return 0
# 对称性的相似系数
def symmtry_coeff(o1, o2):
if o1 == o2:
return 1
return 0
def calculate_Qt(ca, cb):
N = ca.N
qt = 0
for i in range(N):
o1_type = ca.E[i][0] # C1元素类型
o2_type = cb.E[i][0] #
o1_state = ca.E[(i+1) % N][0] # C1连接状态
o2_state = cb.E[(i+1) % N][0]
qt += type_coeff(o1_type, o2_type) + type_coeff(o1_state, o2_state)
# gt /= (2*N)
return qt/(2*N)
def calculate_Qg(ca, cb):
N = ca.N
qg = 0
for i in range(N):
o1_type = ca.E[i][0] # C1元素类型
o2_type = cb.E[i][0] #
o1_state = ca.E[(i + 1) % N][0] # C1连接状态
o2_state = cb.E[(i + 1) % N][0]
o1_method = ca.E[i][1] # C3连接方式
o2_method = cb.E[i][1] #
qg += type_coeff(o1_type, o2_type) + type_coeff(o1_state, o2_state) + method_coeff(o1_method, o2_method)
o1_sym = ca.S # C4对称性
o2_sym = cb.S
qg += symmtry_coeff(o1_sym, o2_sym)
return qg / (3 * N + 1)
def calculate_Qd(ca, cb):
N = ca.N
qd = 0
for i in range(N):
o1_type = ca.E[i][0] # C1元素类型
o2_type = cb.E[i][0] #
o1_state = ca.E[(i + 1) % N][0] # C1连接状态
o2_state = cb.E[(i + 1) % N][0]
o1_method = ca.E[i][1] # C3连接方式
o2_method = cb.E[i][1] #
o1_size = ca.E[i][2] # C5尺寸约束
o2_size = cb.E[i][2]
qd += type_coeff(o1_type, o2_type) + type_coeff(o1_state, o2_state) \
+ method_coeff(o1_method, o2_method) + size_coeff(o1_size, o2_size)
o1_sym = ca.S # C4对称性
o2_sym = cb.S
qd += symmtry_coeff(o1_sym, o2_sym)
return qd / (4 * N + 1)
def core(graph, re_graph):
# -1 代表确定性相似 -2 表示模糊性相似 -3 表示完成不相似
graph_similar = []
jude_similar = []
for i in range(len(graph)): # 检查图的每一个环
s = ''
qt = 0
qg = 0
qd = 0
qt = calculate_Qt(graph[i], re_graph[i])
if qt == 1:
qg = calculate_Qg(graph[i], re_graph[i])
if qg == 1:
qd = calculate_Qd(graph[i], re_graph[i])
# t = qd
if qd == 1:
s = '确定性相似'
elif qd == 0:
s = '完全不相似'
else:
s = '模糊性相似'
elif qg == 0:
s = '完全不相似'
else:
s = '模糊性相似'
elif qt == 0:
s = '完全不相似'
else:
s = '模糊性相似'
similar = qt + qg + qd
graph_similar.append(similar)
jude_similar.append(s)
return graph_similar, jude_similar
"""
元素类型:
直线:0
圆弧:1
圆:2
样条曲线:3
邻接状态:
连接方式:
垂直连接:0
锐连接:1
钝连接A:2
钝连接B:3
相切连接:4
相割连接:5
其它连接:6
尺寸约束状况:
无尺寸约束:0
线性尺寸:1
直径类尺寸:2
半径类尺寸:3
球径类尺寸:4
螺纹类尺寸:5
对称性:
不对称:0
对称:1
"""
if __name__ == '__main__':
c1 = Cycle(4, [[1, 4, 0], [0, 1, 0], [0, 1, 0], [0, 4, 0]], 1)
c2 = Cycle(1, [[2, -1, 4]], 1)
c3 = Cycle(4, [[1, 5, 0], [0, 0, 0], [0, 1, 0], [0, 5, 0]], 0)
c4 = Cycle(4, [[1, 5, 0], [0, 1, 0], [0, 0, 0], [0, 5, 0]], 0)
Graph = [c1, c2, c3, c4]
c1 = Cycle(4, [[1, 4, 0], [0, 1, 0], [0, 1, 0], [0, 4, 0]], 1)
c2 = Cycle(1, [[2, -1, 4]], 1)
c3 = Cycle(4, [[1, 5, 0], [0, 0, 0], [0, 1, 0], [0, 5, 0]], 0)
c4 = Cycle(4, [[1, 5, 0], [0, 1, 0], [0, 0, 0], [0, 5, 0]], 0)
Graph_re0 = [c1, c2, c3, c4]
c1 = Cycle(4, [[1, 4, 0], [0, 1, 1], [0, 1, 1], [0, 4, 1]], 0)
c2 = Cycle(1, [[2, -1, 3]], 1)
c3 = Cycle(4, [[1, 5, 0], [0, 0, 1], [0, 1, 1], [0, 5, 1]], 0)
c4 = Cycle(4, [[1, 5, 0], [0, 1, 1], [0, 0, 1], [0, 5, 1]], 0)
Graph_re1 = [c1, c2, c3, c4]
c1 = Cycle(4, [[1, 4, 0], [0, 1, 0], [0, 1, 0], [0, 4, 0]], 1)
c2 = Cycle(1, [[2, -1, 4]], 1)
c3 = Cycle(4, [[1, 5, 0], [0, 0, 0], [0, 1, 0], [0, 5, 0]], 0)
c4 = Cycle(4, [[1, 5, 0], [0, 1, 0], [0, 0, 0], [0, 5, 0]], 0)
Graph_re2 = [c1, c2, c3, c4]
c1 = Cycle(4, [[1, 4, 0], [0, 1, 0], [0, 1, 0], [0, 4, 0]], 1)
c2 = Cycle(1, [[2, -1, 2]], 1)
c3 = Cycle(4, [[1, 5, 0], [1, 0, 0], [0, 1, 0], [0, 5, 0]], 0)
c4 = Cycle(4, [[1, 5, 0], [2, 1, 0], [0, 0, 0], [0, 5, 0]], 0)
Graph_re3 = [c1, c2, c3, c4]
c1 = Cycle(4, [[1, 4, 0], [0, 1, 1], [0, 1, 1], [0, 4, 1]], 0)
c2 = Cycle(1, [[2, -1, 3]], 1)
c3 = Cycle(4, [[1, 5, 0], [0, 0, 0], [2, 1, 0], [0, 5, 0]], 0)
c4 = Cycle(4, [[1, 5, 0], [0, 1, 0], [1, 0, 0], [0, 5, 0]], 0)
Graph_re4 = [c1, c2, c3, c4]
# Graph_list = [Graph_re0, Graph_re1, Graph_re2, Graph_re3, Graph_re4]
graph_similar, jude_similar = core(Graph,Graph_re0)
print(graph_similar)
print(jude_similar)
与Graph_re0识别(每条弧的相似性):
与Graph_re1识别(每条弧的相似性):
与Graph_re2识别(每条弧的相似性):
与Graph_re3识别(每条弧的相似性):
与Graph_re4识别(每条弧的相似性):