本帖最后由 芯圣电子官方QQ 于 2023-7-20 10:38 编辑
2020 boogie_liusymbol={1:'毛',2:'橡皮',3:'金属',4:'塑料',5:'墨水',6:'有笔尖',7:'需要笔芯',
8:'笔尖金属',9:'笔尖为毛',
10:'可以写字',11:'擦字',12:'去除非铅笔痕迹',
13:'毛笔',14:'钢笔',15:'铅笔',16:'水笔',17:'修改液',18:'橡皮擦'} rule={
13:[9,10],
14:[8,3,5],
16:[8,7],
17:[4,12],
18:[2,11]
} class PRO_SYS:
def __init__(self):
tkey=[]
self.dict_c = rule
self.symbol=symbol
self.tkey=tkey
#输入
def input_sys(self):
x=input("请输入您选择的特征,如:1,2,3(以逗号隔开):")
str=x.split(',')
in_list=[]
#将字符转换为int数组型
for i in str:
in_list.append(int(i))
self.in_list=in_list
return in_list
#将部分字段转换为已知特征
def translate(self):
rule=self.dict_c
put=self.in_list
#判断能否转换为已知信息
for key,value in rule.items():
list_len = 0
for i in value:
if i in put:
list_len += 1
if list_len== len(value):
put.append(key)
for i in value:
put.remove(i)
self.in_list=put
#正向推理
def z_inference(self,c=0.2):#c为允许误差范围
put = self.in_list
print(put)
if len(put)==1:
put_value=put[0]
print("推理结果是"+self.symbol[put_value])
return False
try_dict={}
#查找相似度最大的特征
for key,value in rule.items():
try_dict.setdefault(key,0)
temp=0
for i in put:
if i not in symbol.keys():
print("输入不合法,请重新输入")
return True
elif i in value:
temp+=1
try_dict[key]=temp/len(value)
n=max(val for _,val in try_dict.items())
tkey=[]
#找出相似度最高的几个文具
for key,val in try_dict.items():
if val>=n-c:
tkey.append(key)
#找到相似度最高的几个
print(tkey)
self.tkey=tkey
if len(tkey)==1:
print("推理结果是"+self.symbol[tkey[0]])
return False
else:
#进行逆向推理
return True
#逆向推理
def r_inference(self):
tkey=self.tkey
for key in tkey:
t_len=0
for i in rule[key]:
if i in self.in_list:
t_len+=1
if i not in self.in_list:
print("是否具有:",symbol[i],"特征?",end=None)
x=input("请输入YES/NO")
if x=="NO":
break
if x=="YES":
self.in_list.append(i)
t_len+=1
if t_len== len(rule[key]):
print("该特征逆向推理为:",symbol[key])
break
if name == 'main': print(symbol) sta_pro_sys=PRO_SYS() sta_pro_sys.input_sys() sta_pro_sys.translate() # #只进行正向推理 # sta_pro_sys.z_inference() #正向推理不出就逆向推理 if sta_pro_sys.z_inference(): sta_pro_sys.r_inference()
|