program SmartAirConditioner;
// This program demonstrates a fuzzy logic based smart air conditioning system that adjusts fan speed based on temperature and humidity inputs.
// It defines three linguistic variables (Temperature, Humidity, and FanSpeed) with corresponding fuzzy sets, using a mix of linear and
// triangular membership functions to model different environmental conditions and fan speeds. The system employs a Mamdani type
// Fuzzy Inference System (FIS) with nine rules that encode expert knowledge about comfort levels and appropriate fan speeds for various
// temperature and humidity combinations. The example evaluates the system for a specific scenario (30°C temperature and 70% humidity),
// using the LoM method for defuzzification to determine the recommended fan speed. This simplified model illustrates how fuzzy logic
// can be applied to create a more nuanced and adaptive air conditioning control system, potentially offering improved comfort and
// energy efficiency compared to traditional thermostat systems.
{$i fuzzyrulehelper.inc}
uses
SysUtils, FuzzyLogic;
var
Temperature, Humidity, FanSpeed: TFuzzyVar;
TempCold, TempPleasant, TempWarm, HumDry, HumNormal, HumWet, FanLow, FanMedium, FanHigh: TFuzzySet;
FIS: TFuzzySystemMamdani;
InputTemp, InputHum, OutputFanSpeed: TFuzzyNumeric;
begin
// Define linguistic variables and fuzzy sets
Temperature := TFuzzyVar.Create('Temperature', '°C', 0, 50);
TempCold := TFuzzySet.Create(Temperature, 'Cold', fmLinearFalling, [10, 20]);
TempPleasant := TFuzzySet.Create(Temperature, 'Pleasant', fmTriangular, [15, 25, 35]);
TempWarm := TFuzzySet.Create(Temperature, 'Warm', fmLinearRising, [30, 40]);
Humidity := TFuzzyVar.Create('Humidity', '%', 0, 100);
HumDry := TFuzzySet.Create(Humidity, 'Dry', fmTriangular, [ 0, 25, 50]);
HumNormal := TFuzzySet.Create(Humidity, 'Normal', fmTriangular, [25, 50, 75]);
HumWet := TFuzzySet.Create(Humidity, 'Wet', fmTriangular, [50, 75, 100]);
FanSpeed := TFuzzyVar.Create('FanSpeed', '%', 0, 100, fvOutput);
FanLow := TFuzzySet.Create(FanSpeed, 'Low', fmLinearFalling, [ 0, 50]);
FanMedium := TFuzzySet.Create(FanSpeed, 'Medium', fmTriangular, [25, 50, 75]);
FanHigh := TFuzzySet.Create(FanSpeed, 'High', fmLinearRising, [50, 100]);
// Create Fuzzy Inference System
FIS := TFuzzySystemMamdani.Create;
// Define rules
FIS.AddRule(_IF_ TempCold _AND_ HumDry _THEN_ FanLow); // IF TempCold AND HumDry THEN FanLow
//FIS.AddRule([TempCold, HumDry], FanLow); // IF TempCold AND HumDry THEN FanLow
FIS.AddRule([TempCold, HumNormal], FanLow); // IF TempCold AND HumNormal THEN FanLow
FIS.AddRule([TempCold, HumWet], FanMedium); // IF TempCold AND HumWet THEN FanMedium
FIS.AddRule([TempPleasant, HumDry], FanLow); // IF TempPleasant AND HumDry THEN FanLow
FIS.AddRule([TempPleasant, HumNormal], FanLow); // IF TempPleasant AND HumNormal THEN FanLow
FIS.AddRule([TempPleasant, HumWet], FanMedium); // IF TempPleasant AND HumWet THEN FanMedium
FIS.AddRule([TempWarm, HumDry], FanMedium); // IF TempWarm AND HumDry THEN FanMedium
FIS.AddRule([TempWarm, HumNormal], FanMedium); // IF TempWarm AND HumNormal THEN FanMedium
FIS.AddRule([TempWarm, HumWet], FanHigh); // IF TempWarm AND HumWet THEN FanHigh
// Example evaluation
InputTemp := 30;
InputHum := 70;
OutputFanSpeed := FIS.Evaluate([InputTemp, InputHum], fdmLoM); // Largest-Of-Maximum Mamdani defuzzification
WriteLn(Format('Temperature: %.1f°C, Humidity: %.1f%%', [InputTemp, InputHum]));
WriteLn(Format('Recommended Fan Speed: %.1f%%', [OutputFanSpeed]));
ReadLn;
// Clean up
FIS.Free;
end.