UD05 · Notebook 5 — Lógica difusa: el problema de las propinas¶
Objetivo: implementar de principio a fin el ejemplo difuso de la teoría (§8.4) y comprobar en código las tres fases de un sistema de razonamiento impreciso: fuzzificación, evaluación de reglas y desfuzzificación (CE b).
Es práctica: se trabaja en clase y no se entrega ni puntúa. Prepara las entregas de la unidad y la prueba escrita del RA5.
Antes de empezar¶
pip install scikit-fuzzy networkx
scikit-fuzzy: dos versiones y una trampa¶
La versión 0.4.2 ya no arranca en Python 3.12 o posterior: importa imp y distutils, eliminados del lenguaje. Instala la 0.5.0 (es lo que hace pip install scikit-fuzzy).
En la 0.5.0 falla solo ControlSystem.view(), el dibujo del grafo del sistema, por un error de la librería. Los dibujos de cada variable (servicio.view(), propina.view(sim=sim)) no están afectados, y son los que se usan aquí. Si necesitas el grafo, párchealo:
from skfuzzy.control.visualization import ControlSystemVisualizer
_init_original = ControlSystemVisualizer.__init__
def _init_parcheado(self, control_system):
_init_original(self, control_system)
self.ctrl = control_system
ControlSystemVisualizer.__init__ = _init_parcheado
Fase 1 — Instalación y variables de entrada¶
Define dos antecedentes —servicio y comida, universo 0-10— con tres funciones de pertenencia triangulares cada uno: baja/media/alta y mala/media/buena.
%pip install scikit-fuzzy networkx
import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
# TU CÓDIGO: define los dos Antecedent y sus funciones de pertenencia
servicio = ...
comida = ...
Fase 2 — Variable de salida y reglas¶
Define el consecuente propina (universo 0-25) con sus tres funciones de pertenencia, y las tres reglas de la teoría:
- servicio bajo o comida mala → propina baja
- servicio medio → propina media
- servicio alto o comida buena → propina alta
# TU CÓDIGO: el Consequent y las tres Rule
propina = ...
regla1 = ...
regla2 = ...
regla3 = ...
Fase 3 — Inferencia con el caso de la teoría¶
Monta el sistema de control, simúlalo con servicio 9,8 y comida 6,5, y obtén la propina.
# TU CÓDIGO
sistema = ...
sim = ...
print("Propina:", ...)
✏️ Respuesta: la teoría da 19,24 € y a ti te saldrá una cifra parecida pero no idéntica, en torno a 19-20 €. ¿Por qué?
La resolución de los universos de entrada y salida afecta al resultado de la desfuzzificación por centro de gravedad: con np.arange(0, 26, 1) el universo de la propina tiene 26 puntos, y con más puntos el centro de gravedad se desplaza. Es el mismo fenómeno de sensibilidad del §9: un parámetro que parece un detalle técnico —cuántos puntos tiene el universo discreto— cambia la respuesta del sistema. Compruébalo: repite la fase con np.arange(0, 26, 0.1).
(escribe aquí tu cifra, la del universo más fino, y la diferencia)
Fase 4 — Visualiza las funciones de pertenencia¶
Dibuja las tres variables y el resultado de la inferencia. Guarda las cuatro figuras: son la evidencia de las fases de fuzzificación (las dos de entrada) y de desfuzzificación (la última, con la línea vertical del resultado).
# TU CÓDIGO: dibuja las tres variables y el resultado de la inferencia
...
Fase 5 — Cambia el escenario¶
Repite la Fase 3 con un servicio de 3 (malo) y una comida de 8 (buena).
# TU CÓDIGO
...
✏️ Respuesta: ¿qué regla domina? ¿Es coherente el resultado con lo que esperarías de un cliente que recibió un trato mediocre pero comió muy bien?
(escribe aquí)
Fase 6 — Compara con un sistema de reglas «duro»¶
Escribe la misma lógica con if/elif sobre umbrales fijos (p. ej. servicio >= 8 → propina alta) y compara la salida en varios casos, sobre todo cerca de los umbrales.
def propina_dura(servicio, comida):
# TU CÓDIGO: la misma logica con umbrales fijos
...
for s, c in [(9.8, 6.5), (5.0, 5.0), (5.1, 5.0), (4.9, 5.0)]:
print(s, c, "->", propina_dura(s, c))
✏️ Respuesta: ¿qué le pasa al sistema duro cerca de los umbrales que no le pasa al difuso? ¿En qué casos dan lo mismo las dos versiones y en cuáles no? Relaciónalo con la histéresis del notebook 8.
(escribe aquí)
Qué tienes que tener al terminar¶
Las figuras y las explicaciones de las seis fases, en este mismo notebook.
| Fase | Evidencia mínima |
|---|---|
| 1 | Las dos variables de entrada con sus funciones de pertenencia |
| 2 | La variable de salida y las tres reglas |
| 3 | La propina calculada para el caso de la teoría, y por qué no sale exactamente la misma cifra |
| 4 | Las figuras de las funciones de pertenencia y del resultado |
| 5 | Un escenario propio, con su resultado interpretado |
| 6 | La comparación con un sistema de reglas «duro»: qué cambia en la respuesta |
Las soluciones no se publican: se corrigen y comentan en clase.