接上一篇
若两种构型可以一步转换,即视为相邻
例如
和
不相邻
而
和
相邻
思路
1.两种构型若相邻,只存在两种情况:末端1格点不同或中间1格点不同
若中间一个点不同,相当于序列中两个值互换,如【0,2,1】转换为【2,0,1】,只有第二个点位置不同.所以是相邻。
若末端不同,只要不是180°变换,都可视为相邻,如【0,2,0】、【0,2,1】不相邻,因为是180°变换。【0,2,0】、【0,2,2】则相邻
2.对一个序列逐一进行所有末端变换和中间数据交换,然后找出总集合中和他形状一样的,即可得出一行邻接矩阵。再把所有行拼接即可
from topology3 import rotate,mirror,if_cross
import pickle
import numpy as np
import os
import time
#寻找一种情况是否在所有情况的集合中,如存在,返回索引,不存在返回-1
def find_in_all(l1,l_all):
l=l1.copy()
result=-1
for degree1 in range(2):
for degree2 in range(2):
for degree3 in range(2):
for m1 in range(2):
for m2 in range(2):
for m3 in range(2):
for rev in range(2):
l2 = rotate(l, 0, degree1)
l2 = rotate(l2, 1, degree2)
l2 = rotate(l2, 2, degree3)
if m1 == 1: l2 = mirror(l2, 0)
if m2 == 1: l2 = mirror(l2, 1)
if m3 == 1: l2 = mirror(l2, 2)
if rev == 1: l2.reverse()
try:
result=l_all.index(l2)
except:
pass
return result
#计算出一行邻接矩阵
def adjacent_matrix_line(lf,l_all):
conf_num=len(l_all)
l1=lf.copy()
result_np=np.zeros(conf_num,dtype=np.int8)
for i in range(len(l1)-1):
l2 = l1.copy()
l2[i],l2[i+1]=l2[i+1],l2[i] #交换两个数据
if if_cross(l2):continue
else:
re=find_in_all(l2,l_all)#寻找这种情况是否在其他情况中
if re==-1:pass
else:result_np[re] = 1
#头部有6种变化情况
for b in [0,1,2,3,4,5]:
l2 = l1.copy()
if l2[0]==b+(-1)**b:continue #不可以转180°
if if_cross(l2): continue
l2[0]=b
re=find_in_all(l2,l_all)
if re==-1:pass
else:result_np[re] = 1
# 尾部有6种变化情况
for b in [0,1,2,3,4,5]:
l2 = l1.copy()
if l2[-1]==b+(-1)**b:continue
if if_cross(l2): continue
l2[-1]=b
re=find_in_all(l2,l_all)
if re==-1:pass
else:result_np[re] = 1
return result_np
#画出整个邻接矩阵
def adjacent_matrix(l_all):
conf_num=len(l_all)
result_np_all=np.zeros((conf_num,conf_num))
for i in range(len(l_all)):
aa=np.zeros((i+1),dtype=np.int8)
bb=adjacent_matrix_line(l_all[i], l_all[i+1:])
result_np_all[i]=np.hstack((aa,bb))
result_np_all=result_np_all+result_np_all.T
return result_np_all
#设置格点数n和维度数Dimension
n=7
Dimension=3
f = open('n=' + str(n) + '_'+str(Dimension)+'D_' + 'data.pkl', 'rb')
ex = pickle.load(f)#读取之前的构型数据
xn=adjacent_matrix(ex)#获得邻接矩阵
np.savetxt('n=' + str(n) + '_'+str(Dimension)+'D_' +'adj_mat.csv',xn,fmt='%d',delimiter=',')#保存