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 en el seu article seminal "Fuzzy Sets" (Information and Control, vol. 8), 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 (https://github.com/scikit-fuzzy/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
RA2 · CA2.4
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.