求有限集上给定关系的自反、对称和传递闭包
此程序比较简单,所以直接给出代码,不做解释:
import numpy as np
def mat_to_res(ope, matrix):
num = np.shape(matrix)[0]
res_set = list()
for i in range(num):
for j in range(num):
if matrix[i][j] == 1:
res_set.append('<' + ope[i] + ',' + ' ' + ope[j] + '>')
return '{' + ', '.join(res_set) + '}'
def reflexive(matrix):
num = np.shape(matrix)[0]
for i in range(num):
matrix[i][i] = 1
return matrix
def symmetric(matrix):
num = np.shape(matrix)[0]
for i in range(num):
for j in range(num):
if (matrix[i][j] == 1) and (matrix[j][i] != 1):
matrix[j][i] = 1
return matrix
def transitive(matrix):
num = np.shape(matrix)[0]
for i in range(num):
for j in range(num):
for k in range(num):
matrix[i][j] = 1 if (matrix[i][j] + matrix[i][k] * matrix[k][j]) > 0 else 0
return matrix
if __name__ == '__main__':
# 输入集合
ope_input = input("Please input your operate set: ")
ope_set = [(("'" + it + "'") if (it.isalnum()) else it) for it in ope_input ]
ope_list = list(eval(str.join('', ope_set)))
# 输入有序对
ord_input = input("Please input order set: ")
ord_input = ord_input.replace('<', '[', )
ord_input = ord_input.replace('>', ']')
ord_input = ord_input.replace('{', '[')
ord_input = ord_input.replace('}', ']')
ord_lis = eval(''.join([("'" + it + "'") if it.isalnum() else it for it in ord_input]))
# 生成矩阵
mat = np.zeros((len(ope_list), len(ope_list)))
# 填充矩阵
for i in ord_lis:
mat[ope_list.index(i[0]), ope_list.index(i[1])] = 1
# 生成自反闭包矩阵
print("自反闭包")
mat1 = mat.copy()
mat_reflexive = reflexive(mat1)
print(mat_reflexive)
print(mat_to_res(ope_list, mat_reflexive))
# 生成对称闭包矩阵
print("对称闭包")
mat2 = mat.copy()
mat_symmetric = symmetric(mat2)
print(mat_symmetric)
print(mat_to_res(ope_list, mat_symmetric))
# 生成传递闭包矩阵
print("传递闭包")
mat3 = mat.copy()
mat_transitive = transitive(mat3)
print(mat_transitive)
print(mat_to_res(ope_list, mat_transitive))
实例: