Raonament imprecís i lògica difusa
Motivació: per què la lògica clàssica no és suficient
La lògica booleana clàssica treballa amb valors binaris: vertader (1) o fals (0). Però el món real és ple de conceptes graduats: "fa calor", "el cotxe va ràpid", "el pacient té febre". La lògica difusa (fuzzy logic), introduïda per Lotfi Zadeh el 1965, permet representar i raonar sobre aquesta incertesa.
Conjunts difusos
En la lògica clàssica, un element pertany o no pertany a un conjunt. En la lògica difusa, la pertinença és un valor entre 0 i 1:
- Temperatura = 38°C
- Grau de pertinença a "febre alta" = 0.7
- Grau de pertinença a "febre moderada" = 0.4
- Grau de pertinença a "temperatura normal" = 0.0
Funcions de pertinença habituals: - Triangular - Trapezoïdal - Gaussiana - Sigmoïdal
Variables lingüístiques
Les variables lingüístiques permeten expressar coneixement en termes humans:
- Variable: Velocitat del cotxe
- Termes lingüístics: {molt lenta, lenta, moderada, ràpida, molt ràpida}
- Domini: [0, 200] km/h
Sistema difús complet: estructura
graph LR
E[Entrades nítides] --> F[Fuzzificació]
F --> R[Motor d'inferència\nRegles SI-ALESHORES]
R --> D[Defuzzificació]
D --> S[Sortida nítida]
BC[Base de coneixement\nRegles + Funcions\nde pertinença] --> R
Exemple: sistema de control de climatització
Regles: - SI temperatura és ALTA I humitat és ALTA ALESHORES refrigeració és MÀXIMA - SI temperatura és MODERADA I humitat és BAIXA ALESHORES refrigeració és MÍNIMA - SI temperatura és BAIXA ALESHORES calefacció és ALTA
# Exemple amb scikit-fuzzy
import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
# Variables
temperatura = ctrl.Antecedent(np.arange(0, 41, 1), 'temperatura')
refrigeracio = ctrl.Consequent(np.arange(0, 101, 1), 'refrigeracio')
# Funcions de pertinença
temperatura['baixa'] = fuzz.trimf(temperatura.universe, [0, 0, 20])
temperatura['moderada'] = fuzz.trimf(temperatura.universe, [15, 25, 35])
temperatura['alta'] = fuzz.trimf(temperatura.universe, [30, 40, 40])
refrigeracio['minima'] = fuzz.trimf(refrigeracio.universe, [0, 0, 50])
refrigeracio['maxima'] = fuzz.trimf(refrigeracio.universe, [50, 100, 100])
# Regles
regla1 = ctrl.Rule(temperatura['alta'], refrigeracio['maxima'])
regla2 = ctrl.Rule(temperatura['baixa'], refrigeracio['minima'])
sistema = ctrl.ControlSystem([regla1, regla2])
simulacio = ctrl.ControlSystemSimulation(sistema)
simulacio.input['temperatura'] = 35
simulacio.compute()
print(f"Refrigeració: {simulacio.output['refrigeracio']:.1f}%")
Aplicacions reals de la lògica difusa: - Controls de temperatura (Mitsubishi, Panasonic) - Frenada antibloquejant (ABS) en automòbils - Càmeres fotogràfiques (autoenfoc adaptatiu) - Diagnòstic mèdic (incertesa en símptomes) - Avaluació de risc creditici
Miniactivitat — AC5071/02/03
Dissenya un sistema difús senzill per avaluar la qualitat d'un restaurant. Defineix almenys 2 variables d'entrada (p. ex. qualitat del menjar i servei) i 1 variable de sortida (valoració global). Especifica les funcions de pertinença i almenys 4 regles difuses.