离散数学闭包运算

编程题目:基于关系的矩阵表示,实现关系的自反闭包、对称闭包、传递闭包运算,并计算A上的关系R={<a,b>,<b,a>,<b,c>,<c,d>}的自反闭包、对称闭包、传递闭包,其中A={a,b,c,d}.

编程内容及要求:

编写程序,基于关系的矩阵表示,实现关系的自反闭包、对称闭包、传递闭包运算;利用编写的程序,计算并输出A上的关系R={<a,b>,<b,a>,<b,c>,<c,d>}的自反闭包、对称闭包、传递闭包,其中A={a,b,c,d}.

编程语言可选择C、C++、Java或Python。

闭包输出格式示例:

------------------

自反闭包

------------------

{<a,a>,<b,b>,<c,c>,<d,d>,<a,b>,<b,a>,<b,c>,<c,d>}

------------------

编程目的:学会用程序语言实现关系的矩阵表示,基本的关系矩阵运算,以及闭包运算。

编程语言:

Python

程序设计简要描述:

使用R2M函数将给出的关系R转换成关系矩阵便于计算,

使用r、s、t三个函数分别进行自反、对称、传递闭包的计算

根据定义,自反闭包将对角线元素改为1即可,对称闭包则是将对称位统一,传递闭包使用Warshall算法计算

最后将计算出的闭包关系矩阵使用M2R函数转换成关系的集合

输出的字符文件closure.txt内容(粘贴):

------------------
自反闭包
------------------
{<a,b>,<d,d>,<c,d>,<c,c>,<b,c>,<b,b>,<b,a>,<a,a>}
------------------
对称闭包
------------------
{<a,b>,<c,b>,<c,d>,<d,c>,<b,c>,<b,a>}
------------------
传递闭包
------------------
{<a,b>,<c,d>,<a,d>,<b,d>,<a,c>,<b,c>,<b,b>,<b,a>,<a,a>}
------------------

源程序代码:

1. from copy import deepcopy
 2.  
 3.  
 4. def r(M):
 5.     r_R = deepcopy(M)
 6.     for i in range(len(r_R)):
 7.         r_R[i][i] = 1
 8.     return r_R
 9.  
10. def s(M):
11.     s_R = deepcopy(M)
12.     n = len(s_R)
13.     for i in range(n):
14.         for j in range(i+1):
15.             if s_R[i][j] or s_R[j][i]:
16.                 s_R[i][j] = s_R[j][i] = 1
17.     return s_R
18.  
19. def t(M):
20.     t_R = deepcopy(M)
21.     n = len(t_R)
22.     for k in range(n):
23.         for i in range(n):
24.             for j in range(n):
25.                 if t_R[i][j] + t_R[i][k] * t_R[k][j]:
26.                     t_R[i][j] = 1
27.     return t_R
28.  
29.  
30. def R2M(R, A):
31.     n = len(A)
32.     dic_A = {}
33.     A = list(A)
34.     for i in range(n):
35.         dic_A[A[i]] = i
36.     M = [[0]*n for i in range(n)]
37.     for item in R:
38.         a = item.strip('<>').split(',')[0].strip()
39.         b = item.strip('<>').split(',')[1].strip()
40.         M[dic_A[a]][dic_A[b]] = 1
41.     return M
42.  
43.  
44. def M2R(M, A):
45.     n = len(A)
46.     dic_A = {}
47.     A = list(A)
48.     for i in range(n):
49.         dic_A[i] = A[i]
50.     R = set()
51.     for i in range(n):
52.         for j in range(n):
53.             if M[i][j]:
54.                 R.add(f'<{dic_A[i]},{dic_A[j]}>')
55.     return R
56.  
57.  
58. A = {'a', 'b', 'c', 'd'}
59. R = {'<a,b>', '<b,a>', '<b,c>', '<c,d>'}
60.  
61. # M = R2M(R, A)
62. # print(M)
63. # print(M2R(M, A))
64.  
65.  
66. with open('closure.txt', 'w', encoding='utf-8') as f:
67.     M = R2M(R, A)
68.  
69.     f.write('------------------\n')
70.     f.write('自反闭包\n')
71.     f.write('------------------\n')
72.     r_R = r(M)
73.     f.write(f'{{{",".join(list(M2R(r_R, A)))}}}\n')
74.     f.write('------------------\n')
75.     f.write('对称闭包\n')
76.     f.write('------------------\n')
77.     s_R = s(M)
78.     f.write(f'{{{",".join(list(M2R(s_R, A)))}}}\n')
79.     f.write('------------------\n')
80.     f.write('传递闭包\n')
81.     f.write('------------------\n')
82.     t_R = t(M)
83.     f.write(f'{{{",".join(list(M2R(t_R, A)))}}}\n')
84.     f.write('------------------\n')
85.  

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值