[资源共享]

产生式系统python运行问题

[复制链接]
645|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:


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



使用特权

评论回复
范德萨发法国队|  楼主 | 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:
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()

这个是因为什么回车的时候运行不出来

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

88

帖子

0

粉丝