Implementación de un sistema experto en reconocimiento de animales con Python

  • Investigación sistema de producción
  • Sé que en el vasto mar de motores de búsqueda, puedes ver que mi artículo no es el destino, pero debes entregar tu tarea
  • Antes de tomar el código para "aprender", al menos gusta
  • El código no escribe una GUI, porque no me gusta esto, y realizo directamente interacción humano-computadora en el terminal. Antes de usar el código, modifique la codificación de caracteres y la ruta del archivo de acuerdo con su propia situación
  • El código es terrible. Agregaré el algoritmo para optimizar el código una vez que tenga la habilidad.

Primera pregunta

Primero cree una base de reglas basada en el mapa de preguntas (usando un archivo de texto)

if 有毛发 then 哺乳动物
if 有乳 then 哺乳动物
if 吃肉 then 食肉动物
if 有犬齿 and 有爪 and 眼向前方 then 食肉动物
if 哺乳动物 and 有蹄 then 有蹄类
if 哺乳动物 and 反刍动物 then 有蹄类
if 哺乳动物 and 食肉动物 and 黄褐色 and 暗斑点 then 豹子
if 哺乳动物 and 食肉动物 and 黄褐色 and 黑条纹 then 老虎
if 有蹄类 and 长脖子 and 长腿 and 暗斑点 then 长颈鹿 
if 有蹄类 and 黑条纹 then 斑马

Código:

rules = {} # 以字典形式存储规则


"""
读取规则库文件中规则,并存放在rules字典中
    - 字典的键:前提
    - 字典的值:结论 
"""
def readRules(filePath):
    global rules
    for line in open(filePath, mode = 'r', encoding = 'utf-8'):
        line = line.replace('if', '').strip()
        temp = line.split(' then ')
        premise = temp[0]
        conclusion = temp[1]
        rules[premise] = conclusion

"""
2. 推理机用这些事实(即:facts变量),依次与知识库中的规则的前提匹配
    - 注意:匹配成功的规则可能不止一条,进行冲突消解
3. 若某规则的前提全被事实满足,则规则可以得到运用
4. 规则的结论部分作为新的事实存储
5. 用更新过的事实再与其它规则的前提匹配,直到不再有可匹配的规则为止
"""
def matchRules(facts): 
    print()
    # 循环匹配
    isEnd = False
    def loop():
        global rules
        nonlocal facts, isEnd
        rules_copy = rules.copy()
        i = 0
        for premise in rules:
            flag = True
            # print(premise+ ':' + rules[premise])
            pre = premise.split(' and ')
            for p in pre:
                if p in facts:
                    pass
                else:
                    flag = False
            if(flag):
                print('该动物:' + premise + ' -> ' + rules[premise])
                for p in pre:
                    facts = facts.replace(p, ' ')
                facts = facts + rules[premise]
                rules_copy.pop(premise)
            else:
                i += 1
        if i == len(rules):
            isEnd = True
        rules = rules_copy

    # 是否推导出最终结论     
    while(not isEnd):
        loop()

    
"""
1. 用户通过人机界面输入一批事实
"""
def ui():
    print('----')
    print('--------动物识别系统--------')
    print('----')
    print('注意!请按照规则库中的前提来阐述事实', end='\n\n')
    facts = input('请输入事实:')
    matchRules(facts)


def main():
    filePath = r'动物识别系统/rules.txt'
    readRules(filePath)
    ui()
    


if __name__ == '__main__':
    main()

Ejemplos de interacción humano-computadora:

----
--------动物识别系统--------
----
注意!请按照规则库中的前提来阐述事实

请输入事实:该动物有暗斑点、长脖子、长腿、有乳、有蹄。

该动物:有乳 -> 哺乳动物
该动物:哺乳动物 and 有蹄 -> 有蹄类
该动物:有蹄类 and 长脖子 and 长腿 and 暗斑点 -> 长颈鹿

Segunda pregunta

Reemplace la base de reglas con las siguientes reglas y observe la implementación del sistema:

  1. Los animales peludos son mamíferos;
  2. Los animales con leche son mamíferos;
  3. Los animales emplumados son pájaros;
  4. Si el animal puede volar y poner huevos, es un pájaro;
  5. Los mamíferos carnívoros se llaman carnívoros;
  6. Garras de dientes de perro, y los ojos carnívoros hacia adelante;
  7. Los mamíferos alimenticios de los rumiantes son ungulados;
  8. Los mamíferos con pezuñas son pezuñas;
  9. El bronceado con rayas negras es un tigre;
  10. La especie carnívora carnívora de color marrón amarillento es el leopardo;
  11. Los ungulados de patas largas y cuello largo con manchas marrones oscuras son jirafas;
  12. Los ungulados con rayas blancas y negras son cebras;
  13. El pájaro blanco y negro con un cuello largo y sin patas voladoras es un avestruz;
  14. Los pájaros blancos y negros que no pueden volar bien son pingüinos;
  15. El ave voladora es un albatros.

Simplemente reescriba la base de reglas o puede crear un nuevo archivo de texto

if 有毛发 then 哺乳类
if 有奶 then 哺乳类
if 有羽毛 then 鸟类
if 会飞 and 生蛋 then 鸟类
if 吃肉 and 哺乳类 then 食肉动物
if 犬牙 and 利爪 and 眼睛向前 then 食肉类
if 哺乳类 and 反刍食物 then 有蹄类
if 哺乳类 and 有蹄 then 有蹄类
if 食肉类 and 黄褐色 and 黑色条纹 then 老虎
if 食肉类 and 黄褐色 and 暗斑点 then 金钱豹
if 有蹄类 and 长脖 and 长腿 and 黄褐色 and 暗斑点 then 长颈鹿 
if 有蹄类 and 黑白条纹 then 斑马
if 鸟 and 不会飞 and 长脖子 and 长腿 and 黑白色 then 鸵鸟
if 鸟 and 不会飞 and 善游泳 and 黑白色 then 企鹅
if 鸟 and 善飞 then 信天翁
  • Finalmente, digo que el sistema de producción es realmente estúpido. Si no hago juicios confusos sobre la entrada, lo haré (no hice esto porque no puedo hacerlo porque tengo la capacidad de agregarlo más tarde)

  • Entonces, mi código basura, debe mirar la premisa de la base de reglas antes de ingresar una serie de hechos durante la ejecución; de lo contrario, ingrese 'have milk' en los hechos y 'have milk' en la base de reglas, soy este código No reconozco tu 'leche'

161 artículos originales publicados · 467 elogiados · 240,000 visitas

Supongo que te gusta

Origin blog.csdn.net/Zhangguohao666/article/details/105423594
Recomendado
Clasificación