求有限集上给定关系的自反、对称和传递闭包

求有限集上给定关系的自反、对称和传递闭包

此程序比较简单,所以直接给出代码,不做解释:

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))

实例:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值