def combination(d1, d2):
# 初始化一个字典
united = set(d1.keys()).union(set(d2.keys()))
result=dict.fromkeys(united,0)
## 融合
for i in d1.keys():
for j in d2.keys():
if {''}==i and {''}==j:#''之间的交集
result[i]+=d1[i]*d2[j]
else:
if {''}==i:#'' 'char'
result[j]+=d1[i]*d2[j]
if {''}==j:#'char' ''
result[i]+=d1[i]*d2[j]
if {''}!=i and {''}!=j:
common = frozenset(i.intersection(j))#保存交集
for k in result.keys():
if (len(common)!=0 and(common==k)):#检查之前的交集是否在字典键里
result[k] += d1[i]*d2[j]
break
#四舍五入
for i in result.keys():
result[i] = round(result[i],4)
#四舍五入
f= sum(list(result.values()))
f=round(f,4)
#相除后四舍五入
for i in result.keys():
result[i] =round(result[i]/f,4)
return result
def get_mass(allLines):
mass = {}
previousLine = {}
currentLine = {}
previousLine = transformset(ast.literal_eval(allLines[0]))
for line in range(1,len(allLines)):
if allLines[line][0]!='#':
currentLine = transformset(ast.literal_eval(allLines[line]))
mass = combination(previousLine,currentLine)
previousLine=mass
return mass.copy()
def get_beliefs(masses):
belief = masses.copy()
for i in belief.keys():
for j in belief.keys():
if(i!=j):
if i.issuperset(j) and {''}!=i and {''}!=j:
belief[i]+=masses[j]
for i in belief.keys():
belief[i] = round(belief[i],4) #保留4位小数
return belief
def get_plausibility(masses):
plausibility = masses.copy()
for i in plausibility.keys():
plausibility[i] = 0 #初始化为0
for i in plausibility.keys():
for j in plausibility.keys():
if len(i.intersection(j))!=0 and {''}!=i:
plausibility[i]+=masses[j]
if {''}==j:
plausibility[i]+=masses[j]
for i in plausibility.keys():
plausibility[i] = round(plausibility[i],4) #保留4位小数
return plausibility
import operator
################ ''被选择来表示所有元素的集合
def getkeys(structure):
return set([elem[0] for elem in structure])
import json
def transformset(input):
return dict((frozenset(elem[0]),elem[1]) for elem in input)
def filter_results(beliefs, plausibility):
finalSet = {}
#使用超集过滤具有相同信任值和合理性的元素
for elem in beliefs.keys():
# ssetFlag = False
# for elemb in beliefs.keys():
# if elem!=elemb and elemb.issuperset(elem) and beliefs[elem]==beliefs[elemb] and plausibility[elem]==plausibility[elemb]:
# ssetFlag = True
# break
# if ssetFlag == False and plausibility[elem]!=0.0:
# finalSet[elem] = beliefs[elem]
finalSet[elem] = beliefs[elem]
return finalSet
def get_final_result(elements, plausibility):
resultString = ''
for elem in elements:
setOfElems = elem[0]
movieTypes = str(setOfElems)
# for element in setOfElems:
# movieTypes += decodings[letter]+', '
if elem[0] != {''}:
resultString += movieTypes[11:-2]+' ['+str(elem[1])+', '+str(plausibility[elem[0]])+']\n'
return resultString
s = '''[[{'cold', 'flu'},0.6], [{'meningitis'},0.2], [{'indigestion'},0.1], [{''},0.1]]
[[{'meningitis','indigestion'},0.7], [{''},0.3]]
[[{'cold','flu','indigestion'},0.99], [{''},0.01]]
'''
import io
f = io.StringIO(s)
import ast
mass={}
lines = f.readlines()
if len(lines)>1:
mass = get_mass(lines)
# print(mass)
# all = frozenset({''})
# if all in mass:
# del mass[all]
beliefs = get_beliefs(mass)
# print(beliefs)
plausibility = get_plausibility(mass)
# print(plausibility)
final_set = filter_results(beliefs, plausibility)
# # print(final_set)
# # #order elements
all_elements=sorted(final_set.items(), key=operator.itemgetter(1),reverse=True)
print("Intervals")
print(get_final_result(all_elements, plausibility))