Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

[Proyecto] Construyendo un sistema experto

Ahora sí me siento mucho más cómodo, mis ojos vieron lógica y me activé completamente.

Esta implementación está basada en la respuesta del profesor, pero hice algunos cambios: agregué más reglas (amigdalitis y resfriado común, que no se activan porque no hay esos síntomas), y el print muestra qué regla se activó y por qué en cada paso, y el diagnóstico final está separado de los síntomas iniciales para que sea más legible.

class BaseDeConocimiento:
    def __init__(self):
        self.hechos = []
        self.reglas = []

    def agregar_hecho(self, hecho):
        self.hechos.append(hecho)

    def agregar_regla(self, condicion, conclusion):
        self.reglas.append((condicion, conclusion))


class SistemaExperto:
    def __init__(self, base_conocimiento):
        self.base_conocimiento = base_conocimiento

    def inferir(self):
        print("Sintomas iniciales:")
        for hecho in self.base_conocimiento.hechos:
            print(f"  - {hecho}")
        print()

        nuevos_hechos = True
        while nuevos_hechos:
            nuevos_hechos = False
            for condicion, conclusion in self.base_conocimiento.reglas:
                if all(h in self.base_conocimiento.hechos for h in condicion):
                    if conclusion not in self.base_conocimiento.hechos:
                        self.base_conocimiento.hechos.append(conclusion)
                        nuevos_hechos = True
                        print(f"Regla activada: {' + '.join(condicion)}")
                        print(f"  => Se infiere: {conclusion}\n")


base = BaseDeConocimiento()

base.agregar_hecho("fiebre alta")
base.agregar_hecho("tos")
base.agregar_hecho("dificultad para respirar")

base.agregar_regla(["fiebre alta", "tos"],                          "infeccion respiratoria")
base.agregar_regla(["infeccion respiratoria", "dificultad para respirar"], "neumonia")
base.agregar_regla(["fiebre alta", "dolor de garganta"],            "amigdalitis")
base.agregar_regla(["tos", "congestion nasal"],                     "resfriado comun")

sistema = SistemaExperto(base)
sistema.inferir()

print("Diagnostico final:")
diagnosticos = [h for h in base.hechos if h not in ["fiebre alta", "tos", "dificultad para respirar", "dolor de garganta", "congestion nasal"]]
for d in diagnosticos:
    print(f"  => {d}")

Output:

Regla activada: fiebre alta + tos
  => Se infiere: infeccion respiratoria

Regla activada: infeccion respiratoria + dificultad para respirar
  => Se infiere: neumonia

Diagnostico final:
  => infeccion respiratoria
  => neumonia
2 respuestas

Hola Jairo, espero que estés bien

¡Qué bueno que te sientas más cómodo con la lógica! Parece que estás en el camino correcto con tu implementación del sistema experto. Has seguido bien las instrucciones para crear una base de conocimiento y un mecanismo de inferencia.

Tu código está bien estructurado y es claro. Has añadido reglas adicionales para amigdalitis y resfriado común, lo cual es excelente para expandir las capacidades del sistema. Además, el hecho de que el sistema imprima qué regla se activó y por qué en cada paso ayuda mucho en la comprensión del proceso de inferencia.

Una sugerencia que podría mejorar aún más tu sistema es implementar un mecanismo para evitar que las mismas reglas se activen repetidamente una vez que ya han sido inferidas. Esto podría hacerse manteniendo un registro de las reglas ya aplicadas o los hechos ya inferidos. Aunque en tu caso no parece ser un problema, en sistemas más complejos esto puede ser útil para optimizar el rendimiento.

Por ejemplo, podrías modificar la parte de la inferencia para verificar si una regla ya ha sido aplicada antes de intentar aplicarla nuevamente:

reglas_aplicadas = set()

while nuevos_hechos:
    nuevos_hechos = False
    for condicion, conclusion in self.base_conocimiento.reglas:
        if tuple(condicion) not in reglas_aplicadas and all(h in self.base_conocimiento.hechos for h in condicion):
            if conclusion not in self.base_conocimiento.hechos:
                self.base_conocimiento.hechos.append(conclusion)
                nuevos_hechos = True
                reglas_aplicadas.add(tuple(condicion))
                print(f"Regla activada: {' + '.join(condicion)}")
                print(f"  => Se infiere: {conclusion}\n")

Esto asegura que cada regla se aplique solo una vez por conjunto de hechos, lo que puede ser útil en escenarios más complejos.

Espero que estas sugerencias te sean de ayuda y que sigas disfrutando del proceso de aprendizaje. ¡Espero haber ayudado y buenos estudios!

Tarea De Practica

# Base de conocimiento
class BaseDeConocimiento:
    def __init__(self):
        self.hechos = set()
        self.reglas = []

    def agregar_hecho(self, hecho):
        self.hechos.add(hecho)

    def agregar_regla(self, condiciones, conclusion):
        self.reglas.append((condiciones, conclusion))


# Sistema experto
class SistemaExperto:
    def __init__(self, base):
        self.base = base

    def inferir(self):
        cambio = True

        while cambio:
            cambio = False

            for condiciones, conclusion in self.base.reglas:
                if all(condicion in self.base.hechos for condicion in condiciones):
                    if conclusion not in self.base.hechos:
                        self.base.agregar_hecho(conclusion)
                        print(f"Se dedujo: {conclusion}")
                        cambio = True


# Crear la base de conocimiento
base = BaseDeConocimiento()

# Hechos del paciente
base.agregar_hecho("fiebre alta")
base.agregar_hecho("tos")
base.agregar_hecho("dificultad para respirar")

# Reglas
base.agregar_regla(
    ["fiebre alta", "tos"],
    "infección respiratoria"
)

base.agregar_regla(
    ["infección respiratoria", "dificultad para respirar"],
    "neumonía"
)

# Ejecutar el sistema experto
sistema = SistemaExperto(base)
sistema.inferir()

print("\nDiagnóstico final:")
for hecho in base.hechos:
    print("-", hecho)