人工智能产生式系统

人工智能产生式系统

期末作业,用python写的,知识库就写了一点。可以完善一下知识库。
大概思想是:

通过置信度,得到置信度最高的几个结论(在一定的误差范围内),如果只有一个最大,就返回这个结论。得不到该结论,就进行逆向推理。

大佬就见笑了

# 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:

    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()


  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值