[资源共享] 产生式系统python运行问题

[复制链接]
869|1
 楼主| 范德萨发法国队 发表于 2022-6-30 09:49 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-20 10:38 编辑

2020 boogie_liu

symbol={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:


  1. def __init__(self):
  2.     tkey=[]
  3.     self.dict_c = rule
  4.     self.symbol=symbol
  5.     self.tkey=tkey

  6. #输入
  7. def input_sys(self):
  8.     x=input("请输入您选择的特征,如:1,2,3(以逗号隔开):")
  9.     str=x.split(',')
  10.     in_list=[]
  11.     #将字符转换为int数组型
  12.     for i in str:
  13.         in_list.append(int(i))
  14.     self.in_list=in_list
  15.     return in_list

  16. #将部分字段转换为已知特征
  17. def translate(self):
  18.     rule=self.dict_c
  19.     put=self.in_list
  20.     #判断能否转换为已知信息

  21.     for key,value in rule.items():
  22.         list_len = 0
  23.         for i in value:
  24.             if i in put:
  25.                 list_len += 1
  26.         if list_len== len(value):
  27.             put.append(key)
  28.             for i in value:
  29.                 put.remove(i)
  30.     self.in_list=put


  31. #正向推理
  32. def z_inference(self,c=0.2):#c为允许误差范围
  33.     put = self.in_list
  34.     print(put)
  35.     if len(put)==1:
  36.         put_value=put[0]
  37.         print("推理结果是"+self.symbol[put_value])
  38.         return False
  39.     try_dict={}
  40.     #查找相似度最大的特征
  41.     for key,value in rule.items():
  42.         try_dict.setdefault(key,0)
  43.         temp=0
  44.         for i in put:
  45.             if i not in symbol.keys():
  46.                 print("输入不合法,请重新输入")
  47.                 return True
  48.             elif i in value:
  49.                 temp+=1
  50.         try_dict[key]=temp/len(value)
  51.     n=max(val for _,val in try_dict.items())
  52.     tkey=[]
  53.     #找出相似度最高的几个文具
  54.     for key,val in try_dict.items():
  55.         if val>=n-c:
  56.             tkey.append(key)
  57.     #找到相似度最高的几个

  58.     print(tkey)
  59.     self.tkey=tkey
  60.     if len(tkey)==1:
  61.         print("推理结果是"+self.symbol[tkey[0]])
  62.         return False
  63.     else:
  64.         #进行逆向推理
  65.         return True

  66. #逆向推理
  67. def r_inference(self):
  68.     tkey=self.tkey

  69.     for key in tkey:
  70.         t_len=0
  71.         for i in rule[key]:
  72.             if i in self.in_list:
  73.                 t_len+=1
  74.             if i not in self.in_list:
  75.                 print("是否具有:",symbol[i],"特征?",end=None)
  76.                 x=input("请输入YES/NO")
  77.                 if x=="NO":
  78.                     break
  79.                 if x=="YES":
  80.                     self.in_list.append(i)
  81.                     t_len+=1
  82.         if t_len== len(rule[key]):
  83.             print("该特征逆向推理为:",symbol[key])
  84.             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()



 楼主| 范德萨发法国队 发表于 2022-6-30 09:50 | 显示全部楼层
2020 boogie_liu
symbol={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:
  1. def __init__(self):
  2.     tkey=[]
  3.     self.dict_c = rule
  4.     self.symbol=symbol
  5.     self.tkey=tkey

  6. #输入
  7. def input_sys(self):
  8.     x=input("请输入您选择的特征,如:1,2,3(以逗号隔开):")
  9.     str=x.split(',')
  10.     in_list=[]
  11.     #将字符转换为int数组型
  12.     for i in str:
  13.         in_list.append(int(i))
  14.     self.in_list=in_list
  15.     return in_list

  16. #将部分字段转换为已知特征
  17. def translate(self):
  18.     rule=self.dict_c
  19.     put=self.in_list
  20.     #判断能否转换为已知信息

  21.     for key,value in rule.items():
  22.         list_len = 0
  23.         for i in value:
  24.             if i in put:
  25.                 list_len += 1
  26.         if list_len== len(value):
  27.             put.append(key)
  28.             for i in value:
  29.                 put.remove(i)
  30.     self.in_list=put


  31. #正向推理
  32. def z_inference(self,c=0.2):#c为允许误差范围
  33.     put = self.in_list
  34.     print(put)
  35.     if len(put)==1:
  36.         put_value=put[0]
  37.         print("推理结果是"+self.symbol[put_value])
  38.         return False
  39.     try_dict={}
  40.     #查找相似度最大的特征
  41.     for key,value in rule.items():
  42.         try_dict.setdefault(key,0)
  43.         temp=0
  44.         for i in put:
  45.             if i not in symbol.keys():
  46.                 print("输入不合法,请重新输入")
  47.                 return True
  48.             elif i in value:
  49.                 temp+=1
  50.         try_dict[key]=temp/len(value)
  51.     n=max(val for _,val in try_dict.items())
  52.     tkey=[]
  53.     #找出相似度最高的几个文具
  54.     for key,val in try_dict.items():
  55.         if val>=n-c:
  56.             tkey.append(key)
  57.     #找到相似度最高的几个

  58.     print(tkey)
  59.     self.tkey=tkey
  60.     if len(tkey)==1:
  61.         print("推理结果是"+self.symbol[tkey[0]])
  62.         return False
  63.     else:
  64.         #进行逆向推理
  65.         return True

  66. #逆向推理
  67. def r_inference(self):
  68.     tkey=self.tkey

  69.     for key in tkey:
  70.         t_len=0
  71.         for i in rule[key]:
  72.             if i in self.in_list:
  73.                 t_len+=1
  74.             if i not in self.in_list:
  75.                 print("是否具有:",symbol[i],"特征?",end=None)
  76.                 x=input("请输入YES/NO")
  77.                 if x=="NO":
  78.                     break
  79.                 if x=="YES":
  80.                     self.in_list.append(i)
  81.                     t_len+=1
  82.         if t_len== len(rule[key]):
  83.             print("该特征逆向推理为:",symbol[key])
  84.             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()

这个是因为什么回车的时候运行不出来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

94

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部