UD05 · Notebook 6 — Lógica difusa: ¿quién jugará?¶
Variables: rendimiento, repuesto, amistad
- Si tienes un buen rendimiento en entrenamiento y la amistad es mediana o buena, jugará bastante (Busquets)
- Si tienes un mal rendimiento en el entrenamiento y la amistad es buena, jugará bastante (F.T.)
- Si tienes un mal rendimiento en entrenamiento y poca amistad, jugarás poco (Rakitic)
- Si tienes una buen rendimiento en el entrenamiento, la amistad es mala y ningún repuesto, jugará mucho (Messi con Setien)
- Si tienes una buen rendimiento en el entrenamiento, la amistad es mala y tiene repuesto, jugará poco (Etoo en Guardiola)
- Si tienes una muy buen rendimiento en el entrenamiento, la amistad es mala y tiene repuesto, jugarás mucho (Parejo en Setien)
In [ ]:
Copied!
%pip install scikit-fuzzy networkx
# scikit-fuzzy 0.4.2 ya no arranca en Python 3.12+ (importa `imp` y `distutils`, que
# se eliminaron del lenguaje), asi que instalamos la 0.5.0. En esa version todo
# funciona menos `ControlSystem.view()`: en su visualizador, la linea que guarda el
# sistema quedo dentro de un `if` y nunca se ejecuta. Se arregla en tres lineas:
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
import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
%pip install scikit-fuzzy networkx # scikit-fuzzy 0.4.2 ya no arranca en Python 3.12+ (importa `imp` y `distutils`, que # se eliminaron del lenguaje), asi que instalamos la 0.5.0. En esa version todo # funciona menos `ControlSystem.view()`: en su visualizador, la linea que guarda el # sistema quedo dentro de un `if` y nunca se ejecuta. Se arregla en tres lineas: 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 import numpy as np import skfuzzy as fuzz from skfuzzy import control as ctrl
In [2]:
Copied!
# Variables de entrada
rendimiento = ctrl.Antecedent(np.arange(0, 11, 1), 'rendimiento')
recambio = ctrl.Antecedent(np.arange(0, 11, 1), 'recambio')
relacion = ctrl.Antecedent(np.arange(0, 11, 1), 'relacion')
# Variable de salida
jugara = ctrl.Consequent(np.arange(0, 91, 1), 'jugara')
# Variables de entrada rendimiento = ctrl.Antecedent(np.arange(0, 11, 1), 'rendimiento') recambio = ctrl.Antecedent(np.arange(0, 11, 1), 'recambio') relacion = ctrl.Antecedent(np.arange(0, 11, 1), 'relacion') # Variable de salida jugara = ctrl.Consequent(np.arange(0, 91, 1), 'jugara')
In [3]:
Copied!
# Funciones de pertenencia automática
rendimiento.automf(3)
recambio.automf(3)
relacion.automf(3)
# Funciones de pertenencia automática rendimiento.automf(3) recambio.automf(3) relacion.automf(3)
In [4]:
Copied!
# Funciones de pertenencia personalizadas
jugara['poco'] = fuzz.trimf(jugara.universe, [0, 0, 45])
jugara['bastante'] = fuzz.trimf(jugara.universe, [0, 45, 90])
jugara['mucho'] = fuzz.trimf(jugara.universe, [45, 90, 90])
# Funciones de pertenencia personalizadas jugara['poco'] = fuzz.trimf(jugara.universe, [0, 0, 45]) jugara['bastante'] = fuzz.trimf(jugara.universe, [0, 45, 90]) jugara['mucho'] = fuzz.trimf(jugara.universe, [45, 90, 90])
In [5]:
Copied!
rendimiento.view()
rendimiento.view()
In [6]:
Copied!
recambio.view()
recambio.view()
In [7]:
Copied!
relacion.view()
relacion.view()
In [8]:
Copied!
jugara.view()
jugara.view()
In [9]:
Copied!
# Reglas
# Si tienes un buen rendimiento en entrenamiento y la amistad es mediana o buena, jugará bastante (Busquets)
# Si tienes un mal rendimiento en el entrenamiento y la amistad es buena, jugará bastante (F.T.)
# Si tienes un mal rendimiento en entrenamiento y poca amistad, jugarás poco (Rakitic)
# Si tienes una buen rendimiento en el entrenamiento, la amistad es mala y ningún repuesto, jugará mucho (Messi con Setien)
# Si tienes una buen rendimiento en el entrenamiento, la amistad es mala y tiene repuesto, jugará poco (Etoo en Guardiola)
# Si tienes una muy buen rendimiento en el entrenamiento, la amistad es mala y tiene repuesto, jugarás mucho (Parejo en Setien)
rule1 = ctrl.Rule(rendimiento['good'] & (relacion['average'] | relacion['good']), jugara['bastante'])
rule2 = ctrl.Rule(rendimiento['poor'] & relacion['good'], jugara['bastante'])
rule3 = ctrl.Rule(rendimiento['poor'] & relacion['poor'], jugara['poco'])
rule4 = ctrl.Rule(rendimiento['good'] & relacion['poor'] & (recambio['poor'] | recambio['average']), jugara['mucho'])
rule5 = ctrl.Rule(rendimiento['good'] & relacion['poor'] & recambio['good'], jugara['poco'])
rule6 = ctrl.Rule(rendimiento['average'] & relacion['poor'] & recambio['good'], jugara['mucho'])
control = ctrl.ControlSystem([rule1, rule2, rule3, rule4, rule5, rule6])
# Reglas # Si tienes un buen rendimiento en entrenamiento y la amistad es mediana o buena, jugará bastante (Busquets) # Si tienes un mal rendimiento en el entrenamiento y la amistad es buena, jugará bastante (F.T.) # Si tienes un mal rendimiento en entrenamiento y poca amistad, jugarás poco (Rakitic) # Si tienes una buen rendimiento en el entrenamiento, la amistad es mala y ningún repuesto, jugará mucho (Messi con Setien) # Si tienes una buen rendimiento en el entrenamiento, la amistad es mala y tiene repuesto, jugará poco (Etoo en Guardiola) # Si tienes una muy buen rendimiento en el entrenamiento, la amistad es mala y tiene repuesto, jugarás mucho (Parejo en Setien) rule1 = ctrl.Rule(rendimiento['good'] & (relacion['average'] | relacion['good']), jugara['bastante']) rule2 = ctrl.Rule(rendimiento['poor'] & relacion['good'], jugara['bastante']) rule3 = ctrl.Rule(rendimiento['poor'] & relacion['poor'], jugara['poco']) rule4 = ctrl.Rule(rendimiento['good'] & relacion['poor'] & (recambio['poor'] | recambio['average']), jugara['mucho']) rule5 = ctrl.Rule(rendimiento['good'] & relacion['poor'] & recambio['good'], jugara['poco']) rule6 = ctrl.Rule(rendimiento['average'] & relacion['poor'] & recambio['good'], jugara['mucho']) control = ctrl.ControlSystem([rule1, rule2, rule3, rule4, rule5, rule6])
In [10]:
Copied!
# Simulación
simulacion = ctrl.ControlSystemSimulation(control)
# Simulación simulacion = ctrl.ControlSystemSimulation(control)
In [11]:
Copied!
control.view()
control.view()
In [12]:
Copied!
# Entrada de datos
simulacion.input['rendimiento'] = 8
simulacion.input['recambio'] = 3
simulacion.input['relacion'] = 2
# Entrada de datos simulacion.input['rendimiento'] = 8 simulacion.input['recambio'] = 3 simulacion.input['relacion'] = 2
In [13]:
Copied!
simulacion.compute()
print(simulacion.output['jugara'])
jugara.view(sim=simulacion)
simulacion.compute() print(simulacion.output['jugara']) jugara.view(sim=simulacion)
52.902439024390226
In [14]:
Copied!
# Entrada de datos 2
simulacion.input['rendimiento'] = 3
simulacion.input['recambio'] = 3
simulacion.input['relacion'] = 2
simulacion.compute()
print(simulacion.output['jugara'])
jugara.view(sim=simulacion)
# Entrada de datos 2 simulacion.input['rendimiento'] = 3 simulacion.input['recambio'] = 3 simulacion.input['relacion'] = 2 simulacion.compute() print(simulacion.output['jugara']) jugara.view(sim=simulacion)
18.374999999999996
In [15]:
Copied!
# Entrada de datos 3
simulacion.input['rendimiento'] = 3
simulacion.input['recambio'] = 3
simulacion.input['relacion'] = 8
simulacion.compute()
print(simulacion.output['jugara'])
jugara.view(sim=simulacion)
# Entrada de datos 3 simulacion.input['rendimiento'] = 3 simulacion.input['recambio'] = 3 simulacion.input['relacion'] = 8 simulacion.compute() print(simulacion.output['jugara']) jugara.view(sim=simulacion)
45.00000000000002