Salta el contingut

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.