public void ValueWhenXisOutsideOfRange()
        {
            TrapezoidalFunction func = new TrapezoidalFunction(1.0, 2.0, 1.5, 1.8);

            Assert.AreEqual(func.Value(0.8), 0);
            Assert.AreEqual(func.Value(2.1), 0);
        }
        public void ValueWhenXIsOnTheEdges()
        {
            TrapezoidalFunction func = new TrapezoidalFunction(1.0, 2.0, 1.8, 1.5);

            Assert.AreEqual(func.Value(1.0), 0);
            Assert.AreEqual(func.Value(2.0), 0);
        }
        // Testing basic funcionality of fuzzy sets
        private void runFuzzySetTestButton_Click(object sender, EventArgs e)
        {
            ClearDataSeries( );

            // create 2 fuzzy sets to represent the Cool and Warm temperatures
            TrapezoidalFunction function1 = new TrapezoidalFunction(13, 18, 23, 28);
            FuzzySet            fsCool    = new FuzzySet("Cool", function1);
            TrapezoidalFunction function2 = new TrapezoidalFunction(23, 28, 33, 38);
            FuzzySet            fsWarm    = new FuzzySet("Warm", function2);

            double[,] coolValues = new double[20, 2];
            for (int i = 10; i < 30; i++)
            {
                coolValues[i - 10, 0] = i;
                coolValues[i - 10, 1] = fsCool.GetMembership(i);
            }

            double[,] warmValues = new double[20, 2];
            for (int i = 20; i < 40; i++)
            {
                warmValues[i - 20, 0] = i;
                warmValues[i - 20, 1] = fsWarm.GetMembership(i);
            }

            chart?.UpdateDataSeries("COOL", coolValues);
            chart?.UpdateDataSeries("WARM", warmValues);
        }
        public void ValueWhenXBetweenCAndD()
        {
            TrapezoidalFunction func = new TrapezoidalFunction(1.0, 2.0, 1.8, 1.5);

            Assert.AreEqual(func.Value(1.5), 1);
            Assert.AreEqual(func.Value(1.8), 1);
            Assert.AreEqual(func.Value(1.6), 1);
        }
        public void InequalityOfFuzzySets()
        {
            TriangularFunction  func1 = new TriangularFunction(1.0, 2.0);
            TrapezoidalFunction func2 = new TrapezoidalFunction(1.0, 2.0, 1.8, 1.5);
            FuzzySet            set1  = new FuzzySet(func1);
            FuzzySet            set2  = new FuzzySet(func2);

            Assert.IsFalse(set1.Equals(set2, 1.8));
        }
        public void IntersectionfFuzzySets()
        {
            TriangularFunction  func1 = new TriangularFunction(1.0, 2.0);
            TrapezoidalFunction func2 = new TrapezoidalFunction(1.0, 2.0, 1.8, 1.5);
            FuzzySet            set1  = new FuzzySet(func1);
            FuzzySet            set2  = new FuzzySet(func2);

            Assert.AreEqual(set1.Intersection(set2, 1.0), 0);
        }
예제 #7
0
파일: Sample.cs 프로젝트: old8xp/AForge.NET
        // Testing basic funcionality of linguistic variables
        private void runLingVarTestButton_Click(object sender, EventArgs e)
        {
            ClearDataSeries( );

            // create a linguistic variable to represent temperature
            LinguisticVariable lvTemperature = new LinguisticVariable("Temperature", 0, 80);

            // create the linguistic labels (fuzzy sets) that compose the temperature
            TrapezoidalFunction function1 = new TrapezoidalFunction(10, 15, TrapezoidalFunction.EdgeType.Right);
            FuzzySet            fsCold    = new FuzzySet("Cold", function1);
            TrapezoidalFunction function2 = new TrapezoidalFunction(10, 15, 20, 25);
            FuzzySet            fsCool    = new FuzzySet("Cool", function2);
            TrapezoidalFunction function3 = new TrapezoidalFunction(20, 25, 30, 35);
            FuzzySet            fsWarm    = new FuzzySet("Warm", function3);
            TrapezoidalFunction function4 = new TrapezoidalFunction(30, 35, TrapezoidalFunction.EdgeType.Left);
            FuzzySet            fsHot     = new FuzzySet("Hot", function4);

            // adding labels to the variable
            lvTemperature.AddLabel(fsCold);
            lvTemperature.AddLabel(fsCool);
            lvTemperature.AddLabel(fsWarm);
            lvTemperature.AddLabel(fsHot);

            // get membership of some points to the cool fuzzy set
            double[][,] chartValues = new double[4][, ];
            for (int i = 0; i < 4; i++)
            {
                chartValues[i] = new double[160, 2];
            }

            // showing the shape of the linguistic variable - the shape of its labels memberships from start to end
            int j = 0;

            for (float x = 0; x < 80; x += 0.5f, j++)
            {
                double y1 = lvTemperature.GetLabelMembership("Cold", x);
                double y2 = lvTemperature.GetLabelMembership("Cool", x);
                double y3 = lvTemperature.GetLabelMembership("Warm", x);
                double y4 = lvTemperature.GetLabelMembership("Hot", x);

                chartValues[0][j, 0] = x;
                chartValues[0][j, 1] = y1;
                chartValues[1][j, 0] = x;
                chartValues[1][j, 1] = y2;
                chartValues[2][j, 0] = x;
                chartValues[2][j, 1] = y3;
                chartValues[3][j, 0] = x;
                chartValues[3][j, 1] = y4;
            }

            // plot membership to a chart
            chart.UpdateDataSeries("COLD", chartValues[0]);
            chart.UpdateDataSeries("COOL", chartValues[1]);
            chart.UpdateDataSeries("WARM", chartValues[2]);
            chart.UpdateDataSeries("HOT", chartValues[3]);
        }
예제 #8
0
        public InferenceSystem SetupInferenceSystem(int width)
        {
            var mp = new TrapezoidalFunction(centerPoint - width / 2, centerPoint, centerPoint + width / 2);
            var mn = new TrapezoidalFunction(-centerPoint - width / 2, -centerPoint, -centerPoint + width / 2);
            var sp = new TrapezoidalFunction(-centerPoint / 2 + width / 4, (double)centerPoint / 2, centerPoint / 2 + width / 3);
            var sn = new TrapezoidalFunction(-centerPoint / 2 - width / 3, (double)-centerPoint / 2, centerPoint / 2 - width / 4);
            var ze = new TrapezoidalFunction(-(double)centerPoint / 4, 0, (double)centerPoint / 4);

            var mpSet = new FuzzySet("MP", mp);
            var mnSet = new FuzzySet("MN", mn);
            var spSet = new FuzzySet("SP", sp);
            var snSet = new FuzzySet("SN", sn);
            var zeSet = new FuzzySet("ZE", ze);

            var ruleDatabase = new Database();

            for (int i = 0; i < windowSize * windowSize - 1; i++)
            {
                var variable = new LinguisticVariable(String.Format("IN{0}", i), -255, 255);
                variable.AddLabel(mpSet);
                variable.AddLabel(mnSet);
                ruleDatabase.AddVariable(variable);
            }

            var outVariable = new LinguisticVariable("OUT", -centerPoint - width / 2, centerPoint + width / 2);

            outVariable.AddLabel(spSet);
            outVariable.AddLabel(snSet);
            outVariable.AddLabel(zeSet);
            ruleDatabase.AddVariable(outVariable);
            var    inferenceSystem = new InferenceSystem(ruleDatabase, new CentroidDefuzzifier(100));
            string rule1           = "IF ";
            string rule2           = "IF ";
            string rule3           = "IF ";

            for (int i = 0; i < windowSize * windowSize - 1; i++)
            {
                rule1 += String.Format("IN{0} is MP and ", i);
                rule2 += String.Format("IN{0} is MN and ", i);
                rule3 += String.Format("IN{0} is not MP and IN{0} is not MN AND ", i);
            }

            rule1 = rule1.Remove(rule1.Length - 4, 4);
            rule2 = rule2.Remove(rule2.Length - 4, 4);
            rule3 = "IF NOT (" + rule1.Replace("IF", "") + ") AND NOT(" + rule2.Replace("IF", "") + ")";

            rule1 += " then OUT is SN";
            rule2 += " then OUT is SP";
            rule3 += " then OUT is ZE";

            inferenceSystem.NewRule("Rule1", rule1);
            inferenceSystem.NewRule("Rule2", rule2);
            inferenceSystem.NewRule("Rule3", rule3);

            return(inferenceSystem);
        }
예제 #9
0
        internal void IsConvex_WhenPointsNotConvex_ReturnsFalse()
        {
            // Arrange
            var function = TrapezoidalFunction.Create(0, 1, 2, 3);
            var fuzzySet = new FuzzySet("some_fuzzy_state", function);

            // Act
            var result = fuzzySet.IsConvex;

            // Assert
            Assert.False(result);
        }
예제 #10
0
        internal void IsConvex_WhenPointsAllIncreasing_ReturnsTrue()
        {
            // Arrange
            var function = TrapezoidalFunction.CreateWithRightEdge(0, 3);
            var fuzzySet = new FuzzySet("some_fuzzy_state", function);

            // Act
            var result = fuzzySet.IsConvex;

            // Assert
            Assert.True(result);
        }
예제 #11
0
        // TODO : Add constant function and trapeziodal
        private static IFuzzyFunction defineFunction(Match match)
        {
            string value = match.Groups[3].Value;

            string[] functionParameters = match.Groups[4].Value.Split(' ');

            NumberStyles numberStyles = NumberStyles.AllowParentheses |
                                        NumberStyles.AllowTrailingSign |
                                        NumberStyles.Float |
                                        NumberStyles.AllowThousands |
                                        NumberStyles.AllowExponent;

            if (value == "gaussmf")
            {
                GaussianFunction function = new GaussianFunction();
                function.Center    = Double.Parse(functionParameters[1].ToUpper(), numberStyles, CultureInfo.InvariantCulture);
                function.Steepness = Double.Parse(functionParameters[0].ToUpper(), numberStyles, CultureInfo.InvariantCulture);

                return(function);
            }
            else if (value == "trimf")
            {
                TriangleFunction function = new TriangleFunction();
                function.LeftPoint   = Double.Parse(functionParameters[0].ToUpper(), numberStyles, CultureInfo.InvariantCulture);
                function.MiddlePoint = Double.Parse(functionParameters[1].ToUpper(), numberStyles, CultureInfo.InvariantCulture);
                function.RightPoint  = Double.Parse(functionParameters[2].ToUpper(), numberStyles, CultureInfo.InvariantCulture);

                return(function);
            }
            else if (value == "constant")
            {
                ConstantFunction function = new ConstantFunction();

                function.ConstValue = Double.Parse(functionParameters[0].ToUpper(), numberStyles);

                return(function);
            }
            else if (value == "trapmf")
            {
                TrapezoidalFunction function = new TrapezoidalFunction();

                function.LeftBottomPoint  = Double.Parse(functionParameters[0].ToUpper(), numberStyles, CultureInfo.InvariantCulture);
                function.LeftTopPoint     = Double.Parse(functionParameters[1].ToUpper(), numberStyles, CultureInfo.InvariantCulture);
                function.RightTopPoint    = Double.Parse(functionParameters[2].ToUpper(), numberStyles, CultureInfo.InvariantCulture);
                function.RightBottomPoint = Double.Parse(functionParameters[3].ToUpper(), numberStyles, CultureInfo.InvariantCulture);

                return(function);
            }
            else
            {
                throw new FuzzyLogicException("Unknown function");
            }
        }
예제 #12
0
        internal void FuzzySetCollection_WhenUpperBoundLessThanHighestBoundOfFunctions_Throws()
        {
            // Arrange
            var fuzzySet1 = new FuzzySet("set1", TrapezoidalFunction.Create(1, 2, 3, 4));
            var fuzzySet2 = new FuzzySet("set1", SingletonFunction.Create(1));

            var fuzzySetCollection = new List <FuzzySet> {
                fuzzySet1, fuzzySet2
            };

            // Act
            // Assert
            Assert.Throws <ArgumentOutOfRangeException>(() => new LinguisticVariable("test", fuzzySetCollection, 1, 3));
        }
예제 #13
0
 /// <summary>
 /// Returns a <see cref="LinguisticVariable"/> representing fan speed.
 /// </summary>
 /// <returns>
 /// The <see cref="LinguisticVariable"/>.
 /// </returns>
 public static LinguisticVariable PumpSpeed()
 {
     return(new LinguisticVariable(
                InputVariable.PumpSpeed,
                new List <FuzzySet>
     {
         new FuzzySet(TestKit.PumpSpeed.Off, SingletonFunction.Create(0)),
         new FuzzySet(TestKit.PumpSpeed.VeryLow, TrapezoidalFunction.CreateWithLeftEdge(1, 200)),
         new FuzzySet(TestKit.PumpSpeed.Low, TriangularFunction.Create(0, 500, 1000)),
         new FuzzySet(TestKit.PumpSpeed.Moderate, TriangularFunction.Create(500, 1000, 2000)),
         new FuzzySet(TestKit.PumpSpeed.High, TriangularFunction.Create(3000, 3500, 4000)),
         new FuzzySet(TestKit.PumpSpeed.VeryHigh, TrapezoidalFunction.CreateWithRightEdge(3500, 4999)),
         new FuzzySet(TestKit.PumpSpeed.AtLimit, SingletonFunction.Create(5000))
     }));
 }
        internal void CreateWithLeftEdge_GetMembershipWithVariousInputs_ReturnsExpectedResult(
            double x1,
            double x2,
            double input,
            double expected)
        {
            // Arrange
            var function = TrapezoidalFunction.CreateWithLeftEdge(x1, x2);

            // Act
            var result = function.GetMembership(input);

            // Assert
            Assert.Equal(UnitInterval.Create(expected), result);
        }
예제 #15
0
 /// <summary>
 /// Returns a <see cref="LinguisticVariable"/> representing water temperature.
 /// </summary>
 /// <returns>
 /// The <see cref="LinguisticVariable"/>.
 /// </returns>
 public static LinguisticVariable WaterTemp()
 {
     return(new LinguisticVariable(
                InputVariable.WaterTemp,
                new List <FuzzySet>
     {
         new FuzzySet(TestKit.WaterTemp.Frozen, SingletonFunction.Create(0)),
         new FuzzySet(TestKit.WaterTemp.Freezing, TriangularFunction.Create(0, 5, 10)),
         new FuzzySet(TestKit.WaterTemp.Cold, TrapezoidalFunction.Create(5, 10, 15, 20)),
         new FuzzySet(TestKit.WaterTemp.Warm, TrapezoidalFunction.Create(15, 25, 35, 40)),
         new FuzzySet(TestKit.WaterTemp.Hot, TrapezoidalFunction.Create(35, 60, 80, 100)),
         new FuzzySet(TestKit.WaterTemp.Boiling, TrapezoidalFunction.CreateWithRightEdge(95, 100))
     },
                -20,
                200));
 }
        private InferenceSystem SetupInferenceSystem(byte minLuma, byte maxLuma, byte meanLuma)
        {
            var lumaIn  = new LinguisticVariable("LumaIn", minLuma, maxLuma);
            var lumaOut = new LinguisticVariable("LumaOut", 0, 255);

            var darkFunction = new TrapezoidalFunction(minLuma, meanLuma, TrapezoidalFunction.EdgeType.Right);
            var darkSet      = new FuzzySet("Dark", darkFunction);

            var mediumFunction = new TrapezoidalFunction(minLuma, meanLuma, maxLuma);
            var mediumSet      = new FuzzySet("Medium", mediumFunction);

            var lightFunction = new TrapezoidalFunction(meanLuma, maxLuma, TrapezoidalFunction.EdgeType.Left);
            var lightSet      = new FuzzySet("Light", lightFunction);

            lumaIn.AddLabel(darkSet);
            lumaIn.AddLabel(mediumSet);
            lumaIn.AddLabel(lightSet);

            var whiteFunction = new SingletonFunction(255);
            var whiteSet      = new FuzzySet("White", whiteFunction);

            var blackFunction = new SingletonFunction(0);
            var blackSet      = new FuzzySet("Black", blackFunction);

            var grayFunction = new SingletonFunction(128);
            var graySet      = new FuzzySet("Gray", grayFunction);

            lumaOut.AddLabel(blackSet);
            lumaOut.AddLabel(graySet);
            lumaOut.AddLabel(whiteSet);

            var database = new Database();

            database.AddVariable(lumaIn);
            database.AddVariable(lumaOut);

            var inferenceSystem = new InferenceSystem(database, new CogDefuzzifier());

            inferenceSystem.NewRule("Rule 1", "IF LumaIn IS Dark THEN LumaOut is Black");
            inferenceSystem.NewRule("Rule 2", "IF LumaIn IS Medium THEN LumaOut is Gray");
            inferenceSystem.NewRule("Rule 3", "IF LumaIn IS Light THEN LumaOut is White");

            return(inferenceSystem);
        }
예제 #17
0
        private void SetFuzySet() //ustawia wartość przedziałów
        {
            //ustawia wartości przedziałów dla temperatury zewnętrzej
            TrapezoidalFunction function = new TrapezoidalFunction(-10, 30, TrapezoidalFunction.EdgeType.Right);

            tmpColdOut = new FuzzySet("ColdOut", function);
            function   = new TrapezoidalFunction(-10, 30, TrapezoidalFunction.EdgeType.Left);
            tmpHotOut  = new FuzzySet("HotOut", function);

            //ustawia wartości przedziałów dla temperatury
            function    = new TrapezoidalFunction(1, 10, TrapezoidalFunction.EdgeType.Right);
            tmpVeryCold = new FuzzySet("VeryCold", function);
            function    = new TrapezoidalFunction(5, 10, 13, 16);
            tmpCold     = new FuzzySet("Cold", function);
            function    = new TrapezoidalFunction(13, 16, 21, 26);
            tmpMedium   = new FuzzySet("Medium", function);
            function    = new TrapezoidalFunction(21, 25, 30, 35);
            tmpHot      = new FuzzySet("Hot", function);
            function    = new TrapezoidalFunction(30, 35, TrapezoidalFunction.EdgeType.Left);
            tmpVeryHot  = new FuzzySet("VeryHot", function);
            //ustawia wartości przedziałów dla wilgotności
            function      = new TrapezoidalFunction(0, 40, TrapezoidalFunction.EdgeType.Right);
            smallHumidity = new FuzzySet("Small", function);
            function      = new TrapezoidalFunction(20, 40, 60, 80);
            goodHumidity  = new FuzzySet("Good", function);
            function      = new TrapezoidalFunction(60, 100, TrapezoidalFunction.EdgeType.Left);
            bigHumidity   = new FuzzySet("Big", function);
            //ustawia wartość przedziału przedział siły wentylatora (od zera do 100)
            function          = new TrapezoidalFunction(20, 30, TrapezoidalFunction.EdgeType.Right);
            veryLowStrenght   = new FuzzySet("VeryLow", function);
            function          = new TrapezoidalFunction(20, 30, 40, 50);
            lowStrenght       = new FuzzySet("Low", function);
            function          = new TrapezoidalFunction(40, 50, 60, 70);
            mediumStrenght    = new FuzzySet("Medium", function);
            function          = new TrapezoidalFunction(60, 70, 80, 90);
            hightStrenght     = new FuzzySet("Hight", function);
            function          = new TrapezoidalFunction(80, 90, TrapezoidalFunction.EdgeType.Left);
            veryHightStrenght = new FuzzySet("VeryHight", function);
        }
예제 #18
0
        public Variable(VariableConfig config, Chart chart)
        {
            _chart      = chart;
            _range      = config.Range;
            Name        = config.Name;
            Type        = config.Type;
            _sets       = new List <FuzzySet>();
            ResultValue = null;

            foreach (SetConfig setConfig in config.sets)
            {
                IMembershipFunction membershipFunction = null;
                switch (setConfig.Type)
                {
                case SetType.TrapezoidalFunctionCenter:
                    membershipFunction = new TrapezoidalFunction(setConfig.Values[0], setConfig.Values[1], setConfig.Values[2], setConfig.Values[3]);
                    break;

                case SetType.TrapezoidalFunctionLeft:
                    membershipFunction = new TrapezoidalFunction(setConfig.Values[0], setConfig.Values[1], TrapezoidalFunction.EdgeType.Right);
                    break;

                case SetType.TrapezoidalFunctionRight:
                    membershipFunction = new TrapezoidalFunction(setConfig.Values[0], setConfig.Values[1], TrapezoidalFunction.EdgeType.Left);
                    break;

                default:
                    break;
                }

                FuzzySet newSet = new FuzzySet(setConfig.Name, membershipFunction);
                _sets.Add(newSet);
            }

            Initialize();
        }
        public void RangeWhenAandBArePostive()
        {
            TrapezoidalFunction func = new TrapezoidalFunction(1.0, 2.0, 1.5, 1.8);

            Assert.AreEqual(func.Range(), 1.0);
        }
        public void AllowsToChangeHeight()
        {
            TrapezoidalFunction func = new TrapezoidalFunction(1.0, 2.0, 1.6, 1.5, 0.5);

            Assert.AreEqual(func.GetHeight(), 0.5);
        }
        public void HeightDefaultsTo1()
        {
            TrapezoidalFunction func = new TrapezoidalFunction(1.0, 2.0, 1.6, 1.5);

            Assert.AreEqual(func.GetHeight(), 1.0);
        }
        public void ValueWhenXIsBetweenCandB()
        {
            TrapezoidalFunction func = new TrapezoidalFunction(1.0, 2.0, 1.6, 1.5);

            Assert.AreEqual(func.Value(1.8), 0.5);
        }
        public void ValueWhenXIsBetweenAandD()
        {
            TrapezoidalFunction func = new TrapezoidalFunction(1.0, 2.0, 1.8, 1.4);

            Assert.AreEqual(func.Value(1.2), 0.5);
        }
예제 #24
0
        static void Main(string[] args)
        {
            LinguisticVariable luminosidade = new LinguisticVariable("luminosidade", 0, 14);

            TrapezoidalFunction tf_escura = new TrapezoidalFunction(1, 5, TrapezoidalFunction.EdgeType.Right);
            FuzzySet            escura    = new FuzzySet("escura", tf_escura);

            TrapezoidalFunction tf_pouca = new TrapezoidalFunction(1, 5, 6, 8);
            FuzzySet            pouca    = new FuzzySet("pouca", tf_pouca);

            TrapezoidalFunction tf_media = new TrapezoidalFunction(6, 8, 10, 11);
            FuzzySet            media    = new FuzzySet("media", tf_media);

            TrapezoidalFunction tf_extrema = new TrapezoidalFunction(9, 12, TrapezoidalFunction.EdgeType.Left);
            FuzzySet            extrema    = new FuzzySet("extrema", tf_extrema);

            luminosidade.AddLabel(escura);
            luminosidade.AddLabel(pouca);
            luminosidade.AddLabel(media);
            luminosidade.AddLabel(extrema);

            LinguisticVariable profundidade = new LinguisticVariable("profundidade", (float)0, (float)1.4);

            TrapezoidalFunction tf_rasa = new TrapezoidalFunction((float)0.1, (float)0.3, TrapezoidalFunction.EdgeType.Right);
            FuzzySet            rasa    = new FuzzySet("rasa", tf_rasa);

            TrapezoidalFunction tf_medprof = new TrapezoidalFunction((float)0.1, (float)0.3, (float)0.6, (float)1);
            FuzzySet            mediaprof  = new FuzzySet("media", tf_medprof);

            TrapezoidalFunction tf_profundo = new TrapezoidalFunction((float)0.6, (float)1, (float)1.2);
            FuzzySet            profundo    = new FuzzySet("profundo", tf_profundo);

            TrapezoidalFunction tf_muitoprof = new TrapezoidalFunction((float)1, (float)1.2, TrapezoidalFunction.EdgeType.Left);
            FuzzySet            muitoprof    = new FuzzySet("muito profundo", tf_muitoprof);

            profundidade.AddLabel(rasa);
            profundidade.AddLabel(mediaprof);
            profundidade.AddLabel(profundo);
            profundidade.AddLabel(muitoprof);

            float x = 0;
            float y = 0;
            float profmedia_result     = 0;
            float luminopouca_result   = 0;
            float profrasa_result      = 0;
            float luminoextrema_result = 0;
            float profmuito_result     = 0;
            float luminomed_result     = 0;
            float luminoesc_result     = 0;


            Console.WriteLine("Qual a luminosidade?");
            string n1 = Console.ReadLine();

            x = (float)Convert.ToDouble(n1);

            Console.WriteLine("Qual a profundidade?");
            string n2 = Console.ReadLine();

            y = (float)Convert.ToDouble(n2);

            profmedia_result = profundidade.GetLabelMembership("media", y);

            luminopouca_result = luminosidade.GetLabelMembership("pouca", x);

            profrasa_result = profundidade.GetLabelMembership("rasa", y);

            luminoextrema_result = luminosidade.GetLabelMembership("extrema", x);

            profmuito_result = profundidade.GetLabelMembership("muito profundo", y);

            luminomed_result = luminosidade.GetLabelMembership("media", x);

            luminoesc_result = luminosidade.GetLabelMembership("escura", x);



            Console.WriteLine("Profundidade média e luminosidade pouca = " + Math.Min(profmedia_result, luminopouca_result));

            Console.WriteLine("Profundidade rasa ou Luminosidade extrema =" + Math.Max(profrasa_result, luminoextrema_result));

            Console.WriteLine("Profundidade muito profundo ou profundidade média e luminosidade escura = " + Math.Min(Math.Max(profmuito_result, profmedia_result), luminoesc_result));

            Console.WriteLine("Luminosidade extrema e luminosidade média = " + Math.Min(luminoextrema_result, luminomed_result));



            Console.ReadKey();
        }
예제 #25
0
        internal void RunMamdaniInference(double foodInput, double serviceInput, double expected)
        {
            // Define the input and output linguistic variables.
            var foodQuality = new LinguisticVariable(
                InputVariable.FoodQuality,
                new List <FuzzySet>
            {
                new FuzzySet(FoodQuality.Poor, TrapezoidalFunction.CreateWithLeftEdge(0, 5)),
                new FuzzySet(FoodQuality.Average, TriangularFunction.Create(0, 5, 10)),
                new FuzzySet(FoodQuality.Good, TrapezoidalFunction.CreateWithRightEdge(5, 10))
            });

            var serviceQuality = new LinguisticVariable(
                InputVariable.FoodQuality,
                new List <FuzzySet>
            {
                new FuzzySet(ServiceQuality.Poor, TrapezoidalFunction.CreateWithLeftEdge(0, 5)),
                new FuzzySet(ServiceQuality.Average, TriangularFunction.Create(0, 5, 10)),
                new FuzzySet(ServiceQuality.Good, TrapezoidalFunction.CreateWithRightEdge(5, 10))
            });

            var tipAmount = new LinguisticVariable(
                OutputVariable.TipAmount,
                new List <FuzzySet>
            {
                new FuzzySet(TipAmount.Low, TrapezoidalFunction.CreateWithLeftEdge(0, 13)),
                new FuzzySet(TipAmount.Medium, TriangularFunction.Create(0, 13, 25)),
                new FuzzySet(TipAmount.High, TrapezoidalFunction.CreateWithRightEdge(13, 25))
            });

            // Define the rules for the fuzzy inference engine.
            var rule1 = new FuzzyRuleBuilder(TippingProblem.Rule1)
                        .If(foodQuality.Is(FoodQuality.Poor))
                        .Or(serviceQuality.Is(ServiceQuality.Poor))
                        .Then(tipAmount.Is(TipAmount.Low))
                        .Build();

            var rule2 = new FuzzyRuleBuilder(TippingProblem.Rule2)
                        .If(serviceQuality.Is(ServiceQuality.Average))
                        .Then(tipAmount.Is(TipAmount.Medium))
                        .Build();

            var rule3 = new FuzzyRuleBuilder(TippingProblem.Rule3)
                        .If(foodQuality.Is(FoodQuality.Good))
                        .Or(serviceQuality.Is(ServiceQuality.Good))
                        .Then(tipAmount.Is(TipAmount.High))
                        .Build();

            // Construct the fuzzy inference engine.
            var tnorm       = TriangularNormFactory.MinimumTNorm();
            var tconorm     = TriangularConormFactory.MaximumTConorm();
            var defuzzifier = new CentroidDefuzzifier();
            var fuzzyEngine = new MamdaniInferenceEngine(tnorm, tconorm, defuzzifier);

            // Add the rules to the rulebase.
            fuzzyEngine.Rulebase.AddRule(rule1);
            fuzzyEngine.Rulebase.AddRule(rule2);
            fuzzyEngine.Rulebase.AddRule(rule3);

            // Prepare database to receive inputs.
            fuzzyEngine.Database.AddVariable(Label.Create(InputVariable.FoodQuality));
            fuzzyEngine.Database.AddVariable(Label.Create(InputVariable.ServiceQuality));

            // Generate input data.
            var foodData    = new DataPoint(InputVariable.FoodQuality, foodInput);
            var serviceData = new DataPoint(InputVariable.ServiceQuality, serviceInput);

            // Feed inference engine the data.
            fuzzyEngine.Database.UpdateData(foodData);
            fuzzyEngine.Database.UpdateData(serviceData);

            // Compute the inference engine.
            var result = fuzzyEngine.Compute();

            Assert.Equal(OutputVariable.TipAmount.ToString(), result[0].Subject.Value);
            Assert.Equal(expected, result[0].Value);
        }
        public void RangeWhenAandBAreOfDifferentSigns()
        {
            TrapezoidalFunction func = new TrapezoidalFunction(-1.0, 2.0, 1.8, -0.8);

            Assert.AreEqual(func.Range(), 3.0);
        }
        public void RangeWhenAandBAreNegative()
        {
            TrapezoidalFunction func = new TrapezoidalFunction(-1.0, -2.0, -1.8, -1.2);

            Assert.AreEqual(func.Range(), 1.0);
        }