Exemple #1
0
    public static FuzzySet[] CreateFuzzySets(FuzzySetGroupDesc group)
    {
        FuzzySet[] sets = new FuzzySet[group.Sets.Count];

        for (int i = 0; i < group.Sets.Count; i++)
        {
            FuzzySetDesc desc = group.Sets[i];
            sets[i] = new FuzzySet(desc.Name, new PiecewiseLinearFunction(desc.Points));
        }

        return(sets);
    }
Exemple #2
0
    public FuzzySetGroupCharts(FuzzySetGroupDesc group)
    {
        this.Name = group.Name;

        float chartMin = group.GetChartMin();
        float chartMax = group.GetChartMax();

        this.Charts = new List <FuzzySetChart>();
        for (int i = 0; i < group.Sets.Count; i++)
        {
            this.Charts.Add(new FuzzySetChart(group.Sets[i], chartMin, chartMax));
        }
    }
Exemple #3
0
    private void InitFuzz()
    {
        this.Charts = new List <FuzzySetGroupCharts>();
        Database db = new Database();

        // fuzzy set to determine perceived distance
        FuzzySetGroupDesc distanceGroup = new FuzzySetGroupDesc("Distance");

        distanceGroup.Add(new FuzzySetDescLeft("Near", 0.75f, 2.5f));
        distanceGroup.Add(new FuzzySetDescMid("Medium", 0.75f, 2.5f, 3, 10));
        distanceGroup.Add(new FuzzySetDescRight("Far", 3, 10));

        this.Charts.Add(new FuzzySetGroupCharts(distanceGroup));
        FuzzySet[] distanceSets = FuzzUtil.CreateFuzzySets(distanceGroup);

        db.AddVariable(FuzzUtil.CreateVariable("RightDistance", 0, 10, distanceSets));
        db.AddVariable(FuzzUtil.CreateVariable("LeftDistance", 0, 10, distanceSets));
        db.AddVariable(FuzzUtil.CreateVariable("FrontDistance", 0, 10, distanceSets));

        // fuzzy set to determine heading directions
        FuzzySetGroupDesc headingGroup = new FuzzySetGroupDesc("Heading");

        headingGroup.Add(new FuzzySetDescLeft("HardLeft", -35, -30));
        headingGroup.Add(new FuzzySetDescMid("Left", -35, -30, -20, -15));
        headingGroup.Add(new FuzzySetDescMid("SlightLeft", -20, -15, -5, 0));
        headingGroup.Add(new FuzzySetDescMid("Straight", -5, -1, 1, 5));
        headingGroup.Add(new FuzzySetDescMid("SlightRight", 0, 5, 15, 20));
        headingGroup.Add(new FuzzySetDescMid("Right", 15, 20, 30, 35));
        headingGroup.Add(new FuzzySetDescRight("HardRight", 30, 35));

        this.Charts.Add(new FuzzySetGroupCharts(headingGroup));
        FuzzySet[] headingSets = FuzzUtil.CreateFuzzySets(headingGroup);

        db.AddVariable(FuzzUtil.CreateVariable("Heading", -50, 50, headingSets));

        _inferenceSystem = new InferenceSystem(db, new CentroidDefuzzifier(50));

        // if all is clear ahead go for it
        _inferenceSystem.NewRule("1", "IF FrontDistance IS Far THEN Heading IS Straight");

        // should handle left/right turns
        _inferenceSystem.NewRule("2", "IF FrontDistance IS Near AND RightDistance IS Near THEN Heading IS Left");
        _inferenceSystem.NewRule("3", "IF FrontDistance IS Near AND LeftDistance IS Near THEN Heading IS Right");

        // edge away from walls
        _inferenceSystem.NewRule("4", "IF LeftDistance IS Near AND (RightDistance IS Medium OR RightDistance IS Far) THEN Heading IS SlightRight");
        _inferenceSystem.NewRule("5", "IF RightDistance IS Near AND (LeftDistance IS Medium OR LeftDistance IS Far) THEN Heading IS SlightLeft");

        // attempt to give priority to left turns if both are available?
        _inferenceSystem.NewRule("6", "IF FrontDistance IS Near THEN Heading IS Left");
    }