赞
踩
目录
第1关:求给定集合的对角线关系(diagonal relation)
这个他也说了,恒等关系,好办的很!
- def diagonalRelation(self):
- ########## Begin ##########
- return Relation(self.sets, set([(a, a) for a in self.sets]))
- ########## End ##########
如果 self.sets
是一个包含元素 'A'
、'B'
和 'C'
的集合,那么 set([(a, a) for a in self.sets])
将生成一个包含元组 ('A', 'A')
、 ('B', 'B')
和 ('C', 'C')
的集合。
这好说也就是(x1,y1) (x2,y2)如果y1等于x2那么便可以合成为(x1,y2)
- def __mul__(self, other):
- assert self.sets == other.sets
- return Relation(self.sets, set([(x, y1) for x, y in other.rel for x1, y1 in self.rel if y == x1]))
- def __pow__(self, power, modulo=None):
- assert power >= -1
- if power == -1:
- return Relation(self.sets, set([(x, y) for y, x in self.rel]))
- elif power == 0:
- return self.diagonalRelation()
- return self ** (power - 1) * self
这简单加一下就行了!
- def __add__(self, other):
- assert self.sets == other.sets
- ########## Begin ##########
- # 将两个关系的关系集合进行并集操作
- new_rel = self.rel.union(other.rel)
- return Relation(self.sets, new_rel)
- #实现两个关系的并运算,重载+运算符,即self+other表示self并other
- #请注意,是Relation对象rel成员的并
- #返回结果为一个Relation对象
- # 请删除pass后编程实现该方法功能
-
- ########## End ##########
- def toMatrix(self):
- #将序偶集合形式的关系转换为矩阵。
- #为保证矩阵的唯一性,需对self.sets中的元素先排序
- matrix = []
- elems = sorted(list(self.sets))
- line = [0]*len(self.sets)
- for elem in elems:
- ########## Begin ##########
- #请在此处编写程序,实现转换为矩阵的功能
- for x, y in self.rel:
- if x == elem:
- line[elems.index(y)] = 1
- matrix.append(line)
- line = [0] * len(self.sets)
- #请在上面编写程序,不要修改下面的代码
- ########## End ##########
-
- return matrix
- def isReflexive(self):
- ########## Begin ##########
- #判断self是否为自反关系,是则返回True,否则返回False
- # 请删除pass后编程实现该方法功能
- for x in self.sets:
- if (x, x) not in self.rel:
- return False
- return True
-
- ########## End ##########
- def isIrreflexive(self):
- ########## Begin ##########
- # 判断self是否为反自反关系,是则返回True,否则返回False
- # 请删除pass后编程实现该方法功能
- for x in self.sets:
- if (x, x) in self.rel:
- return False
- return True
- def isSymmetric(self):
-
- ########## Begin ##########
- # 判断self是否为对称关系,是则返回True,否则返回False
- # 请删除pass后编程实现该方法功能
- for x, y in self.rel:
- if (y, x) not in self.rel:
- return False
- return True
-
- def isAsymmetric(self):
- ########## Begin ##########
- # 判断self是否为非对称关系,是则返回True,否则返回False
- # 请删除pass后编程实现该方法功能
- for x, y in self.rel:
- if (y, x) in self.rel:
- return False
- return True
- def isAntiSymmetric(self):
- ########## Begin ##########
- # 判断self是否为反对称关系,是则返回True,否则返回False
- # 请删除pass后编程实现该方法功能
- for x, y in self.rel:
- if (y, x) in self.rel and x != y:
- return False
- return True
-
- def isTransitive(self):
-
- ########## Begin ##########
- # 判断self是否为传递关系,是则返回True,否则返回False
- # 请删除pass后编程实现该方法功能
- for x, y in self.rel:
- for x1, y1 in self.rel:
- if x1 == y:
- if (x, y1) not in self.rel:
- return False
- return True
- ########## End ##########
- def reflexiveClosure(self):
-
- ########## Begin ##########
- #求self的自反闭包,注意使用前面已经重载过的运算符
- #返回一个Relation对象,为self的自反闭包
- # 请删除pass后编程实现该方法功能
- return self + self.diagonalRelation()
-
- ########## End ##########
- def symmetricClosure(self):
-
- ########## Begin ##########
- # 求self的对称闭包,注意使用前面已经重载过的运算符
- # 返回一个Relation对象,为self的对称闭包
- # 请删除pass后编程实现该方法功能
- return self + self ** -1
-
- ########## End ##########
- def transitiveClosure(self):
- closure = self
- # 求self的传递闭包,注意使用前面已经重载过的运算符
- # 该方法实现的算法:严格按照传递闭包计算公式求传递闭包
- #********** Begin **********#
- for i in range(2, len(self.sets) + 1):
- if closure.isTransitive(): # 反正是或运算,可以省此判断,或许还会更快算得
- break
- closure = closure + self ** i
- #********** End **********#
- return closure
- def __warshall(self, a):
- assert (len(row) == len(a) for row in a)
- n = len(a)
- #请在下面编程实现Roy-Warshall求传递闭包的算法
- #参数a:为一个关系矩阵
- #********** Begin **********#
- for r in range(n):
- for c in range(len(a[r])):
- if a[c][r] == 1:
- for k in range(n):
- a[c][k] = a[c][k] | a[r][k]
- #********** End **********#
- return a
- def isEquivalenceRelation(rel):
- #该函数对给定的Relation对象rel,判断其是否为等价关系
- #是则返回True,否则返回False
- #********** Begin **********#
- return rel.isReflexive() and rel.isSymmetric() and rel.isTransitive()
-
-
- #********** End **********#
- def createPartition(rel):
- #对给定的Relation对象rel,求其决定的rel.sets上的划分
- #如果rel不是等价关系,返回空集
- if not isEquivalenceRelation(rel):
- print("The given relation is not an Equivalence Relation")
- return set([])
- #如rel是等价关系,实现求划分的程序
- partition = set([])
- #********** Begin **********#
- partition = set([])
- for elem in rel.sets: # 给个元素的等价类
- partition.add(frozenset(y for x, y in rel.rel if x == elem))
-
- #********** End **********#
- return partition
- def createEquivalenceRelation(partition, A):
- #对给定的集合A,以及A上的一个划分partition
- #生成由该划分决定的等价关系
- assert functools.reduce(lambda x, y: x.union(y), partition) == A
- #********** Begin **********#
- return Relation(A, set((a,b) for part in partition for a in part for b in part))
-
- #********** End **********#
- def isPartialOrder(rel):
- # 该函数对给定的Relation对象rel,判断其是否为半序关系
- #是则返回True,否则返回False。
- #********** Begin **********#
- return (rel ** (-1)).rel.intersection(rel.rel) == set((x, x) for x in rel.sets)
-
- #********** End **********#
- def isQuasiOrder(rel):
- # 该函数对给定的Relation对象rel,判断其是否为拟序关系
- # 是则返回True,否则返回False。
- #********** Begin **********#
-
-
- return rel.isIrreflexive() and rel.isAntiSymmetric() and rel.isTransitive()
-
- #********** End **********#
- def isLinearOrder(rel):
- # 该函数对给定的Relation对象rel,判断其是否为全序关系
- #是则返回True,否则返回False
- if not isPartialOrder(rel):
- return False
- else:
- #********** Begin **********#
- return set(x for x, y in rel.rel if x != y) == rel.sets == set(y for x, y in rel.rel if x != y)
-
-
- #********** End **********#
- def join(rel1, rel2):
- #对给定的关系rel1和rel2
- assert rel1.sets == rel2.sets
- #首先得到二者的矩阵
- M1 = rel1.toMatrix()
- M2 = rel2.toMatrix()
- m = len(M1)
- n = m
- M = []
- #********** Begin **********#
- #实现关系矩阵的join运算,结果存于M中
- for r in range(m):
- row = [0] * n
- for c in range(n):
- row[c] = M1[r][c] | M2[r][c] # 或
- M.append(row)
- return M
- #********** End **********#
- def meet(rel1, rel2):
- # 对给定的关系rel1和rel2
- assert rel1.sets == rel2.sets
- # 首先得到二者的矩阵
- M1 = rel1.toMatrix()
- M2 = rel2.toMatrix()
- m = len(M1)
- n = m
- M = []
- #********** Begin **********#
- # 实现关系矩阵的meet运算,结果存于M中
- for r in range(m):
- row = [0] * n
- for c in range(n):
- row[c] = M1[r][c] & M2[r][c]
- M.append(row)
-
-
- #********** End **********#
- return M
- def booleanProduct(rel1, rel2):
- # 对给定的关系rel1和rel2
- assert rel1.sets == rel2.sets
-
- # 首先得到二者的矩阵
- M1 = rel1.toMatrix()
- M2 = rel2.toMatrix()
-
- m = len(M1)
- n = m
- M = []
- #********** Begin **********#
- # 实现关系矩阵的布尔乘积运算,结果存于M中
- for r in range(m):
- row_M1_r = M1[r] # 准备M1矩阵的行
- row_M_r = [0] * n
- for c in range(n):
- col_M2_c = [M2[r_2][c] for r_2 in range(m)] # 准备M2矩阵的列
- # 计算r行c列的结果
- row_M_r[c] = 1 if sum([x & y for x, y in zip(row_M1_r, col_M2_c)]) else 0
- M.append(row_M_r)
- #********** End **********#
- return M
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。