1. Scenario e obiettivi
Consideriamo una piccola serra per coltivare ortaggi. Vogliamo controllare due attuatori:
- un riscaldatore,
- un sistema di irrigazione.
Come ingressi useremo:
- Temperatura interna,
- Umidità del suolo.
Obiettivo: mantenere la serra in condizioni favorevoli alla crescita, usando un controllo fuzzy invece di soglie rigide.
2. Variabili linguistiche
Definiamo alcune variabili linguistiche con le loro etichette fuzzy.
Ingresso: Temperatura
- BASSA
- CONFORTEVOLE
- ALTA
Ingresso: UmiditàSuolo
- SECCA
- OK
- FRADICIA
Uscita: PotenzaRiscaldatore
- SPENTO
- MEDIO
- MASSIMO
Uscita: DurataIrrigazione
- ZERO
- BREVE
- LUNGA
Le funzioni di appartenenza per queste etichette possono essere progettate seguendo le linee guida della pagina sulle Funzioni di appartenenza fuzzy.
3. Base di regole per la serra
Esempi di regole in stile Mamdani:
- SE Temperatura è BASSA ALLORA PotenzaRiscaldatore è MASSIMO.
- SE Temperatura è CONFORTEVOLE ALLORA PotenzaRiscaldatore è MEDIO.
- SE Temperatura è ALTA ALLORA PotenzaRiscaldatore è SPENTO.
- SE UmiditàSuolo è SECCA ALLORA DurataIrrigazione è LUNGA.
- SE UmiditàSuolo è OK ALLORA DurataIrrigazione è BREVE.
- SE UmiditàSuolo è FRADICIA ALLORA DurataIrrigazione è ZERO.
Possiamo aggiungere regole più raffinate combinando entrambe le variabili, ad esempio:
- SE Temperatura è ALTA E UmiditàSuolo è SECCA ALLORA DurataIrrigazione è LUNGA.
4. Flusso di calcolo fuzzy
- Fuzzificazione: calcolo dei gradi di appartenenza di Temperatura e UmiditàSuolo alle etichette definite.
- Inferenza: applicazione delle regole (es. schema Mamdani) usando operatori min/max.
- Aggregazione: combinazione dei contributi di tutte le regole per PotenzaRiscaldatore e DurataIrrigazione.
- Defuzzificazione: trasformazione degli insiemi fuzzy di uscita in valori numerici (es. potenza % e secondi di irrigazione).
Questo flusso ricalca quello descritto nella pagina sullo Schema Mamdani.
5. Scheletro in Python
Un possibile scheletro (semplificato) in Python potrebbe essere:
class SerraFuzzyController:
def __init__(self, temperature_mfs, soil_moisture_mfs, heater_mfs, irrigation_mfs, rules):
self.temperature_mfs = temperature_mfs
self.soil_moisture_mfs = soil_moisture_mfs
self.heater_mfs = heater_mfs
self.irrigation_mfs = irrigation_mfs
self.rules = rules
def compute(self, temperature, soil_moisture):
# 1. fuzzificazione (qui solo come commento)
# 2. applicazione regole
# 3. aggregazione
# 4. defuzzificazione
# Restituisce potenza_riscaldatore, durata_irrigazione
pass
Su fuzzypython.org puoi completare questo scheletro con:
- implementazioni concrete delle funzioni di appartenenza,
- un semplice motore di inferenza Mamdani,
- un esempio numerico con valori di ingresso realistici per la serra.