离散数学:用python实现关系闭包的计算,即自反、对称与传递

离散数学:用python实现关系闭包的计算,即自反、对称与传递,第1张

目录

一、原理

二、代码实现

三、运行结果


一、原理

在关系矩阵中,

自反闭包的主对角线元素全为1;

对称闭包的元素关于主对角线对称;

传递闭包使用warshall算法【离散数学(第2版)-屈婉玲等著   P129见详解】

二、代码实现
import copy

L = []  # 建立空列表存放即将输入的矩阵
order = int(input())  # 输入矩阵的阶数

for i in range(order):
    nums = list(map(int, input().split()))
    L.append(nums)  # 依次输入每行的数字 把矩阵形成二维列表 L[0]表示该矩阵第一行的数字

def l_add(a, b):   # 逻辑加
    if a == 0 and b == 0:
        return 0
    else:
        return 1
def res_r(L):   # 自反闭包
    res_r = copy.deepcopy(L)
    for i in range(order):
        for j in range(order):
            if i == j:
                res_r[i][j] = 1
    for i in res_r:
        for j in i:
            print(j, end=' ')
        print()
def res_s(L):   # 对称闭包
    res_s = copy.deepcopy(L)
    for i in range(order):
        for j in range(order):
            if res_s[i][j] == 1:
                res_s[j][i] = 1
    for i in res_s:
        for j in i:
            print(j, end=' ')
        print()
def res_t(L):   # 传递闭包-warshall算法
    res_t = copy.deepcopy(L)
    for j in range(order):
        for i in range(order):
            if int(res_t[i][j]) == 1:
                for k in range(order):
                    res_t[i][k] = l_add(int(res_t[i][k]), int(res_t[j][k]))
    for i in res_t:
        for j in i:
            print(j, end=' ')
        print()

print("r(R):")
res_r(L)
print("s(R):")
res_s(L)
print("t(R):")
res_t(L)

注:

将一个列表赋值给另一个空列表,

在本代码中使用 list2 = list1[:] 或 list2=list1.copy() 在后续运算中均会改变原列表元素,

经查阅资料得,涉及到浅拷贝与深拷贝

本次代码使用了深拷贝,即 list2 = copy.deepcopy(list1)【需要import一下】

三、运行结果

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/715111.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存