..Back
×
Fuzzy algorithm example in js
Author: Win Aung Cho2025-05-06 07:39:13PM
Fuzzy logic
Fuzzy logic is logic where state membership is, essentially, a float with range 0..1 (truth value) instead of an int 0 or 1.
- Fuzzy Sets: Collections where elements have degrees of membership (e.g., "cold" temperature could be 0.7).
- Membership Functions: Mathematical functions that assign a membership value to an element.
- Rules: Logical statements like "IF temperature is warm THEN fan speed is medium."
- Defuzzification: Converting fuzzy values into crisp, actionable outputs.
<body>
<script>
class FuzzySet {
constructor(name, values) {
this.name = name;
this.values = values;
}
membership(x) {
if(x <= this.values[0]) return 0;
if(x >= this.values[this.values.length - 1]) return 0;
if(this.values.length === 3) { // Triangular
const [a, b, c] = this.values;
if(x > a && x <= b) return(x - a) / (b - a);
if(x > b && x < c) return(c - x) / (c - b);
}
return 0;
}
}
class FuzzyRule {
constructor(antecedent, consequent) {
this.antecedent = antecedent;
this.consequent = consequent;
}
}
class FuzzyThermostat {
constructor() {
this.temperatureSets = {
cold: new FuzzySet("cold", [10, 15, 20]),
comfortable: new FuzzySet("comfortable", [18, 22, 26]),
hot: new FuzzySet("hot", [24, 30, 35])
};
this.temperatureChangeSets = {
decrease: new FuzzySet("decrease", [-6, -3, 0]),
noChange: new FuzzySet("noChange", [-1, 0, 1]),
increase: new FuzzySet("increase", [1, 4, 7])
};
this.rules = [
new FuzzyRule({
temperature: this.temperatureSets.cold
}, {
change: this.temperatureChangeSets.increase
}),
new FuzzyRule({
temperature: this.temperatureSets.comfortable
}, {
change: this.temperatureChangeSets.noChange
}),
new FuzzyRule({
temperature: this.temperatureSets.hot
}, {
change: this.temperatureChangeSets.decrease
})
];
}
determineChange(temperature) {
let aggregatedOutput = {};
for(const rule of this.rules) {
const antecedentMembership = rule.antecedent.temperature.membership(temperature);
if(antecedentMembership > 0) {
const consequentKey = rule.consequent.change.name;
if(!aggregatedOutput[consequentKey] || antecedentMembership > aggregatedOutput[consequentKey]) {
aggregatedOutput[consequentKey] = antecedentMembership;
}
}
}
let defuzzifiedValue = 0;
let sumOfMemberships = 0;
for(const key in aggregatedOutput) {
const set = this.temperatureChangeSets[key];
const membershipValue = aggregatedOutput[key];
const representativeValue = set.values[1]; // Use the center value for simplicity
defuzzifiedValue += representativeValue * membershipValue;
sumOfMemberships += membershipValue;
}
return sumOfMemberships === 0 ? 0 : defuzzifiedValue / sumOfMemberships;
}
adjustTemperature(currentTemperature, changeValue) {
return currentTemperature + changeValue;
}
}
// Example Usage
const thermostat = new FuzzyThermostat();
let currentTemperature = 12;
for(let i = 0; i < 5; i++) {
const change = thermostat.determineChange(currentTemperature);
showlog(`Current Temperature: ${currentTemperature}, Recommended Change: ${change}`);
currentTemperature = thermostat.adjustTemperature(currentTemperature, change);
}
function showlog(){
var str="";
for (var i = 0; i < arguments.length; i++) {
str += arguments[i];
}
var div=document.getElementById("info");
if (!div){
div = document.createElement("div");
div.setAttribute("id", "info");
document.body.appendChild(div);
}
div.innerHTML += "<br/>" + str;
}
</script>
</body>
Author: Win Aung Cho