All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.cschen1205.fuzzylogic.FuzzySet Maven / Gradle / Ivy

The newest version!
package com.github.cschen1205.fuzzylogic;


import com.github.cschen1205.fuzzylogic.memberships.Membership;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class FuzzySet implements Serializable, Cloneable
{
    private static final long serialVersionUID = -4073774254458691213L;

    protected Map mMemberships = new HashMap<>();
    protected List mValues = new ArrayList<>();

    private double minValue = 0;
    private double maxValue = 1;
    private double mDeltaX = 0.0001;
    private String mName = null;
    private double mValX = 0;

    public FuzzySet(String name, double lower_bound, double upper_bound, double dX)
    {
        this.mName = name;
        this.minValue = lower_bound;
        this.maxValue = upper_bound;
        this.mDeltaX = dX;
    }

    public FuzzySet(String name, double lower_bound, double upper_bound)
    {
        this.mName = name;
        this.minValue = lower_bound;
        this.maxValue = upper_bound;
    }

    public Membership GetMembership(String value)
    {
        return mMemberships.get(value);
    }

    public String GetMembershipName(int index)
    {
        return mValues.get(index);
    }

    public int GetMembershipCount()
    {
        return mValues.size();
    }

    public Membership GetMembership(int index)
    {
        return GetMembership(mValues.get(index));
    }

    public double getX() {
        return mValX;
    }

    public void setX(double value){
        mValX = value;
    }

    public String getName()
    {
        return mName;
    }

    public double GetMinX()
    {
        return minValue;
    }

    public double GetMaxX()
    {
        return maxValue;
    }

    public double GetDeltaX()
    {
        return mDeltaX;
    }

    public void addMembership(String membershipname, Membership membership)
    {
        mValues.add(membershipname);
        mMemberships.put(membershipname, membership);
    }

    public void fire(List rules)
    {
        Map> degrees = new HashMap<>();
        for (int i = 0; i < mValues.size(); ++i)
        {
            degrees.put(mValues.get(i), new ArrayList<>());
        }

        for (int i = 0; i < rules.size(); ++i)
        {
            Rule rule = rules.get(i);
            Clause consequent = rule.getConsequent();
            if (consequent.getVariable() == this)
            {
                double y = 1;

                for (int j = 0; j < rule.getAntecedentCount(); ++j)
                {
                    Clause antecedent = rule.getAntecedent(j);
                    FuzzySet variable = antecedent.getVariable();
                    String value = antecedent.getVariableValue();
                    Membership ms = variable.GetMembership(value);
                    double degree = ms.degree(variable.getX());
                    if (y > degree)
                    {
                        y = degree;
                    }

                }
                degrees.get(consequent.getVariableValue()).add(y);
            }
        }

        Map consequent_degrees = getRootSumSquare(degrees);

        mValX = getAreaCentroid(consequent_degrees);
    }

    public Map getRootSumSquare(Map> degrees)
    {
        Map results = new HashMap<>();

        for(String value : degrees.keySet())
        {
            List de = degrees.get(value);
            double squareSum = 0;
            for (int i = 0; i < de.size(); ++i)
            {
                double v = de.get(i);
                squareSum += v * v;
            }
            results.put(value, Math.sqrt(squareSum));
        }

        return results;
    }

    /*
    public double getFuzzyCentroid(Map degrees)
    {
        double sumxy=0;
        double sumy=0;
        for(int i=0; i degrees)
    {
        double sumxy = 0;
        double sumy = 0;
        for (double x = minValue; x <= maxValue; x += mDeltaX)
        {
            for (int i = 0; i < mValues.size(); ++i)
            {
                Membership ms = mMemberships.get(mValues.get(i));
                double d1 = degrees.get(mValues.get(i));
                double d2 = ms.degree(x);
                double y = d1 > d2 ? d2 : d1;

                sumxy += (x * y);
                sumy += y;
            }
        }

        return sumxy / sumy;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy