画出所有格点构型的邻接矩阵

接上一篇
若两种构型可以一步转换,即视为相邻
例如
在这里插入图片描述
在这里插入图片描述
不相邻


在这里插入图片描述

在这里插入图片描述
相邻

思路
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=',')#保存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值