本帖最后由 芯圣电子官方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()
|