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
rendiment = ctrl.Antecedent(np.arange(0, 11, 1), 'rendiment')
recanvi = ctrl.Antecedent(np.arange(0, 11, 1), 'recanvi')
relacio = ctrl.Antecedent(np.arange(0, 11, 1), 'relacio')
# Variable de salida
jugara = ctrl.Consequent(np.arange(0, 91, 1), 'jugara')
# Variables de entrada rendiment = ctrl.Antecedent(np.arange(0, 11, 1), 'rendiment') recanvi = ctrl.Antecedent(np.arange(0, 11, 1), 'recanvi') relacio = ctrl.Antecedent(np.arange(0, 11, 1), 'relacio') # Variable de salida jugara = ctrl.Consequent(np.arange(0, 91, 1), 'jugara')
In [3]:
Copied!
# Funciones de pertenencia automática
rendiment.automf(3)
recanvi.automf(3)
relacio.automf(3)
# Funciones de pertenencia automática rendiment.automf(3) recanvi.automf(3) relacio.automf(3)
In [4]:
Copied!
# Funciones de pertenencia personalizadas
jugara['poc'] = fuzz.trimf(jugara.universe, [0, 0, 45])
jugara['prou'] = fuzz.trimf(jugara.universe, [0, 45, 90])
jugara['molt'] = fuzz.trimf(jugara.universe, [45, 90, 90])
# Funciones de pertenencia personalizadas jugara['poc'] = fuzz.trimf(jugara.universe, [0, 0, 45]) jugara['prou'] = fuzz.trimf(jugara.universe, [0, 45, 90]) jugara['molt'] = fuzz.trimf(jugara.universe, [45, 90, 90])
In [5]:
Copied!
rendiment.view()
rendiment.view()
In [6]:
Copied!
recanvi.view()
recanvi.view()
In [7]:
Copied!
relacio.view()
relacio.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(rendiment['good'] & (relacio['average'] | relacio['good']), jugara['prou'])
rule2 = ctrl.Rule(rendiment['poor'] & relacio['good'], jugara['prou'])
rule3 = ctrl.Rule(rendiment['poor'] & relacio['poor'], jugara['poc'])
rule4 = ctrl.Rule(rendiment['good'] & relacio['poor'] & (recanvi['poor'] | recanvi['average']), jugara['molt'])
rule5 = ctrl.Rule(rendiment['good'] & relacio['poor'] & recanvi['good'], jugara['poc'])
rule6 = ctrl.Rule(rendiment['average'] & relacio['poor'] & recanvi['good'], jugara['molt'])
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(rendiment['good'] & (relacio['average'] | relacio['good']), jugara['prou']) rule2 = ctrl.Rule(rendiment['poor'] & relacio['good'], jugara['prou']) rule3 = ctrl.Rule(rendiment['poor'] & relacio['poor'], jugara['poc']) rule4 = ctrl.Rule(rendiment['good'] & relacio['poor'] & (recanvi['poor'] | recanvi['average']), jugara['molt']) rule5 = ctrl.Rule(rendiment['good'] & relacio['poor'] & recanvi['good'], jugara['poc']) rule6 = ctrl.Rule(rendiment['average'] & relacio['poor'] & recanvi['good'], jugara['molt']) control = ctrl.ControlSystem([rule1, rule2, rule3, rule4, rule5, rule6])
In [10]:
Copied!
# Simulación
simulacio = ctrl.ControlSystemSimulation(control)
# Simulación simulacio = ctrl.ControlSystemSimulation(control)
In [11]:
Copied!
control.view()
control.view()
In [12]:
Copied!
# Entrada de datos
simulacio.input['rendiment'] = 8
simulacio.input['recanvi'] = 3
simulacio.input['relacio'] = 2
# Entrada de datos simulacio.input['rendiment'] = 8 simulacio.input['recanvi'] = 3 simulacio.input['relacio'] = 2
In [13]:
Copied!
simulacio.compute()
print(simulacio.output['jugara'])
jugara.view(sim=simulacio)
simulacio.compute() print(simulacio.output['jugara']) jugara.view(sim=simulacio)
52.902439024390226
In [14]:
Copied!
# Entrada de datos 2
simulacio.input['rendiment'] = 3
simulacio.input['recanvi'] = 3
simulacio.input['relacio'] = 2
simulacio.compute()
print(simulacio.output['jugara'])
jugara.view(sim=simulacio)
# Entrada de datos 2 simulacio.input['rendiment'] = 3 simulacio.input['recanvi'] = 3 simulacio.input['relacio'] = 2 simulacio.compute() print(simulacio.output['jugara']) jugara.view(sim=simulacio)
18.374999999999996
In [15]:
Copied!
# Entrada de datos 3
simulacio.input['rendiment'] = 3
simulacio.input['recanvi'] = 3
simulacio.input['relacio'] = 8
simulacio.compute()
print(simulacio.output['jugara'])
jugara.view(sim=simulacio)
# Entrada de datos 3 simulacio.input['rendiment'] = 3 simulacio.input['recanvi'] = 3 simulacio.input['relacio'] = 8 simulacio.compute() print(simulacio.output['jugara']) jugara.view(sim=simulacio)
45.00000000000002