Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

Haz lo que hicimos en el aula: Construyendo un sistema experto

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):
        regla = {
            "condiciones": set(condiciones),
            "conclusion": conclusion
        }
        self.reglas.append(regla)

    def obtener_hechos(self):
        return self.hechos

    def obtener_reglas(self):
        return self.reglas


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

    def inferir(self):
        nuevos_hechos = True

        while nuevos_hechos:
            nuevos_hechos = False

            for regla in self.base_conocimiento.obtener_reglas():
                condiciones = regla["condiciones"]
                conclusion = regla["conclusion"]

                # Verifica si todas las condiciones están en los hechos conocidos
                if condiciones.issubset(self.base_conocimiento.obtener_hechos()):
                    if conclusion not in self.base_conocimiento.obtener_hechos():
                        self.base_conocimiento.agregar_hecho(conclusion)
                        nuevos_hechos = True

                        explicacion = (
                            f"Como se cumplen las condiciones {condiciones}, "
                            f"se concluye: {conclusion}"
                        )
                        self.razonamiento.append(explicacion)

    def mostrar_diagnosticos(self):
        print("Hechos y diagnósticos encontrados:")
        print("----------------------------------")

        for hecho in self.base_conocimiento.obtener_hechos():
            print(f"- {hecho}")

    def mostrar_razonamiento(self):
        print("\nRazonamiento seguido:")
        print("---------------------")

        if not self.razonamiento:
            print("No se generaron nuevas conclusiones.")
        else:
            for paso in self.razonamiento:
                print(f"- {paso}")


# Crear base de conocimiento
base = BaseDeConocimiento()

# Hechos entregados por el paciente
base.agregar_hecho("fiebre alta")
base.agregar_hecho("tos")
base.agregar_hecho("dificultad para respirar")

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

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

base.agregar_regla(
    ["tos", "dificultad para respirar"],
    "posible compromiso respiratorio"
)

# Crear sistema experto
sistema = SistemaExperto(base)

# Ejecutar inferencia
sistema.inferir()

# Mostrar resultados
sistema.mostrar_diagnosticos()
sistema.mostrar_razonamiento()

Hechos y diagnósticos encontrados:

  • fiebre alta
  • tos
  • dificultad para respirar
  • infección respiratoria
  • neumonía
  • posible compromiso respiratorio

Razonamiento seguido:

  • Como se cumplen las condiciones {'fiebre alta', 'tos'}, se concluye: infección respiratoria
  • Como se cumplen las condiciones {'infección respiratoria', 'dificultad para respirar'}, se concluye: neumonía
  • Como se cumplen las condiciones {'tos', 'dificultad para respirar'}, se concluye: posible compromiso respiratorio

La clase BaseDeConocimiento almacena los hechos, que representan los síntomas reportados por el paciente, y las reglas, que relacionan esos síntomas con posibles diagnósticos.

Luego, la clase SistemaExperto aplica un mecanismo de inferencia basado en lógica proposicional. El sistema revisa si los hechos existentes cumplen las condiciones de cada regla. Si una regla se cumple, agrega una nueva conclusión como hecho. Este proceso se repite hasta que ya no se puedan obtener nuevas conclusiones.

Por ejemplo, si el paciente presenta fiebre alta y tos, el sistema concluye que puede existir una infección respiratoria. Luego, si además existe dificultad para respirar, el sistema puede inferir neumonía. De esta forma, el sistema explica paso a paso el razonamiento utilizado para llegar a cada diagnóstico.

1 respuesta

¡Hola Gino, espero que estés bien!

Parece que estás trabajando en un proyecto muy interesante de un sistema experto para ayudar en el diagnóstico de condiciones respiratorias. Tu código está bien estructurado y parece que estás siguiendo correctamente los pasos para construir el sistema experto.

Aquí tienes un resumen de lo que tu código hace y cómo se alinea con la tarea que se te asignó:

  1. Definición de la base de conocimiento: Has creado la clase BaseDeConocimiento que almacena los hechos y las reglas. Los hechos son los síntomas reportados, y las reglas son las relaciones entre estos síntomas y los diagnósticos posibles.

  2. Desarrollo del mecanismo de inferencia: La clase SistemaExperto toma la base de conocimiento y aplica un mecanismo de inferencia para deducir conclusiones. Utiliza lógica proposicional para verificar si las condiciones de las reglas se cumplen con los hechos conocidos y, si es así, agrega nuevas conclusiones.

  3. Implementación de diagnósticos: Has añadido ejemplos de hechos, como "fiebre alta" y "tos", y reglas que permiten deducir diagnósticos como "infección respiratoria" y "neumonía".

  4. Prueba del sistema: Al ejecutar el método inferir, el sistema aplica las reglas y concluye los diagnósticos correctos, mostrando tanto los hechos como el razonamiento seguido.

Tu implementación parece estar funcionando correctamente, ya que el sistema está generando los diagnósticos esperados y proporcionando una explicación del razonamiento utilizado. Si tienes alguna duda específica sobre alguna parte del código o si te gustaría explorar alguna funcionalidad adicional, no dudes en comentar.

Espero haber ayudado y buenos estudios!