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); }
// 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]); }
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); }
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); }
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); }
// 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"); } }
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)); }
/// <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); }
/// <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); }
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); }
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); }
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(); }
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); }