public static MamdaniFuzzySystem CreateMamdaniSystem(List<FuzzyVariable> inputs, List<FuzzyVariable> outputs) { MamdaniFuzzySystem fuzzySystem = new MamdaniFuzzySystem(); fuzzySystem.Input.AddRange(inputs); fuzzySystem.Output.AddRange(outputs); return fuzzySystem; }
public DecisionMakerType1( List<FuzzyVariable> inputVariables, FuzzyVariable outputVariable, RulesList ruleDefinitions, List<string> includedVariables = null) { if (includedVariables == null) { includedVariables = (from v in inputVariables select v.Name).ToList(); } this.fsWellEval = new MamdaniFuzzySystem(); this.fsWellEval.Input.AddRange(from v in inputVariables where includedVariables.Contains(v.Name) select v); this.fsWellEval.Output.Add(outputVariable); this.RulesDefinitions = new RulesList(); foreach (var rule in ruleDefinitions.Items) { string[] splitDef = rule.Definition.Split( new[] { "if", "and", "(", ")" }, StringSplitOptions.RemoveEmptyEntries); string updatedDef = string.Empty; foreach (var condition in splitDef) { if (condition == string.Empty) { continue; } var trimmedCondition = condition.Trim(); if (trimmedCondition.StartsWith("then")) { updatedDef += trimmedCondition; } else { string variable = trimmedCondition.Split(' ')[0]; if (includedVariables.Contains(variable)) { string keyword = updatedDef == string.Empty ? "if" : "and"; updatedDef += string.Format("{0} ({1}) ", keyword, trimmedCondition); } } } if (!RulesDefinitions.Items.Exists(r => r.Definition.Equals(updatedDef))) { this.RulesDefinitions.Items.Add(new RuleDef { Definition = updatedDef, Weight = rule.Weight }); MamdaniFuzzyRule newRule = this.fsWellEval.ParseRule(updatedDef); this.fsWellEval.Rules.Add(newRule); } } }
MamdaniFuzzySystem CreateSystem() { // // Create empty fuzzy system // MamdaniFuzzySystem fsTips = new MamdaniFuzzySystem(); // // Create input variables for the system // FuzzyVariable fvService = new FuzzyVariable("service", 0.0, 10.0); fvService.Terms.Add(new FuzzyTerm("poor", new TriangularMembershipFunction(-5.0, 0.0, 5.0))); fvService.Terms.Add(new FuzzyTerm("good", new TriangularMembershipFunction(0.0, 5.0, 10.0))); fvService.Terms.Add(new FuzzyTerm("excellent", new TriangularMembershipFunction(5.0, 10.0, 15.0))); fsTips.Input.Add(fvService); FuzzyVariable fvFood = new FuzzyVariable("food", 0.0, 10.0); fvFood.Terms.Add(new FuzzyTerm("rancid", new TrapezoidMembershipFunction(0.0, 0.0, 1.0, 3.0))); fvFood.Terms.Add(new FuzzyTerm("delicious", new TrapezoidMembershipFunction(7.0, 9.0, 10.0, 10.0))); fsTips.Input.Add(fvFood); // // Create output variables for the system // FuzzyVariable fvTips = new FuzzyVariable("tips", 0.0, 30.0); fvTips.Terms.Add(new FuzzyTerm("cheap", new TriangularMembershipFunction(0.0, 5.0, 10.0))); fvTips.Terms.Add(new FuzzyTerm("average", new TriangularMembershipFunction(10.0, 15.0, 20.0))); fvTips.Terms.Add(new FuzzyTerm("generous", new TriangularMembershipFunction(20.0, 25.0, 30.0))); fsTips.Output.Add(fvTips); // // Create three fuzzy rules // try { MamdaniFuzzyRule rule1 = fsTips.ParseRule("if (service is poor ) or (food is rancid) then tips is cheap"); MamdaniFuzzyRule rule2 = fsTips.ParseRule("if ((service is good)) then tips is average"); MamdaniFuzzyRule rule3 = fsTips.ParseRule("if (service is excellent) or (food is delicious) then (tips is generous)"); fsTips.Rules.Add(rule1); fsTips.Rules.Add(rule2); fsTips.Rules.Add(rule3); } catch (Exception ex) { MessageBox.Show(string.Format("Parsing exception: {0}", ex.Message)); return null; } return fsTips; }
private void btnRun_Click(object sender, EventArgs e) { // // Create new fuzzy system // if (_fsTips == null) { _fsTips = CreateSystem(); if (_fsTips == null) { return; } } // // Get variables from the system (for convinience only) // FuzzyVariable fvService = _fsTips.InputByName("service"); FuzzyVariable fvFood = _fsTips.InputByName("food"); FuzzyVariable fvTips = _fsTips.OutputByName("tips"); // // Associate input values with input variables // Dictionary<FuzzyVariable, double> inputValues = new Dictionary<FuzzyVariable, double>(); inputValues.Add(fvService, (double)nudInputService.Value); inputValues.Add(fvFood, (double)nudInputFood.Value); // // Calculate result: one output value for each output variable // Dictionary<FuzzyVariable, double> result = _fsTips.Calculate(inputValues); // // Get output value for the 'tips' variable // tbTips.Text = result[fvTips].ToString("f1"); }
public static Dictionary<NodeInstance, double> PrioritizeNodes(List<NodeInstance> nodes) { MamdaniFuzzySystem fsNodeSys = new MamdaniFuzzySystem(); FuzzyVariable fvCPU = new FuzzyVariable("cpu", 0.0, 1); fvCPU.Terms.Add(new FuzzyTerm("low", new TriangularMembershipFunction(-.50, 0, .50))); fvCPU.Terms.Add(new FuzzyTerm("med", new TriangularMembershipFunction(0, .50, 1))); fvCPU.Terms.Add(new FuzzyTerm("high", new TriangularMembershipFunction(.50, 1, 1.5))); fsNodeSys.Input.Add(fvCPU); FuzzyVariable fvBandwidth = new FuzzyVariable("bandwidth", 0.0, 1); fvBandwidth.Terms.Add(new FuzzyTerm("low", new TriangularMembershipFunction(-.50, 0, .50))); fvBandwidth.Terms.Add(new FuzzyTerm("med", new TriangularMembershipFunction(0, .50, 1))); fvBandwidth.Terms.Add(new FuzzyTerm("high", new TriangularMembershipFunction(.50, 1, 1.5))); fsNodeSys.Input.Add(fvBandwidth); FuzzyVariable fvFreeSpace = new FuzzyVariable("freespace", 0.0, 1); fvFreeSpace.Terms.Add(new FuzzyTerm("low", new TriangularMembershipFunction(-.5, 0, .5))); fvFreeSpace.Terms.Add(new FuzzyTerm("moderate", new TriangularMembershipFunction(0, .5, 1))); fvFreeSpace.Terms.Add(new FuzzyTerm("ample", new TriangularMembershipFunction(.5, 1, 1.5))); fsNodeSys.Input.Add(fvFreeSpace); // // Create output variables for the system // FuzzyVariable fvRank = new FuzzyVariable("rank", 0, 1); fvRank.Terms.Add(new FuzzyTerm("low", new TriangularMembershipFunction(-0.25, 0, 0.25))); fvRank.Terms.Add(new FuzzyTerm("med_low", new TriangularMembershipFunction(0, 0.25, 0.50))); fvRank.Terms.Add(new FuzzyTerm("med", new TriangularMembershipFunction(0.25, 0.50, 0.75))); fvRank.Terms.Add(new FuzzyTerm("med_high", new TriangularMembershipFunction(0.50, 0.75, 1))); fvRank.Terms.Add(new FuzzyTerm("high", new TriangularMembershipFunction(0.75, 1, 1.25))); fsNodeSys.Output.Add(fvRank); MamdaniFuzzyRule rule1 = fsNodeSys.ParseRule("if (cpu is low) and (bandwidth is high) and (freespace is ample) then rank is med"); MamdaniFuzzyRule rule2 = fsNodeSys.ParseRule("if (cpu is low) and (bandwidth is high) and (freespace is moderate) then rank is med_low"); MamdaniFuzzyRule rule3 = fsNodeSys.ParseRule("if (cpu is low) and (bandwidth is high) and (freespace is low) then rank is low"); MamdaniFuzzyRule rule4 = fsNodeSys.ParseRule("if (cpu is low) and (bandwidth is med) and (freespace is ample) then rank is med_high"); MamdaniFuzzyRule rule5 = fsNodeSys.ParseRule("if (cpu is low) and (bandwidth is med) and (freespace is moderate) then rank is med_high"); MamdaniFuzzyRule rule6 = fsNodeSys.ParseRule("if (cpu is low) and (bandwidth is med) and (freespace is low) then rank is med_low"); MamdaniFuzzyRule rule7 = fsNodeSys.ParseRule("if (cpu is low) and (bandwidth is low) and (freespace is ample) then rank is high"); MamdaniFuzzyRule rule8 = fsNodeSys.ParseRule("if (cpu is low) and (bandwidth is low) and (freespace is moderate) then rank is med_high"); MamdaniFuzzyRule rule9 = fsNodeSys.ParseRule("if (cpu is low) and (bandwidth is low) and (freespace is low) then rank is med_low"); MamdaniFuzzyRule rule10 = fsNodeSys.ParseRule("if (cpu is med) and (bandwidth is high) and (freespace is ample) then rank is med"); MamdaniFuzzyRule rule11 = fsNodeSys.ParseRule("if (cpu is med) and (bandwidth is high) and (freespace is moderate) then rank is med_low"); MamdaniFuzzyRule rule12 = fsNodeSys.ParseRule("if (cpu is med) and (bandwidth is high) and (freespace is low) then rank is med_low"); MamdaniFuzzyRule rule13 = fsNodeSys.ParseRule("if (cpu is med) and (bandwidth is med) and (freespace is ample) then rank is med"); MamdaniFuzzyRule rule14 = fsNodeSys.ParseRule("if (cpu is med) and (bandwidth is med) and (freespace is moderate) then rank is med"); MamdaniFuzzyRule rule15 = fsNodeSys.ParseRule("if (cpu is med) and (bandwidth is med) and (freespace is low) then rank is low"); MamdaniFuzzyRule rule16 = fsNodeSys.ParseRule("if (cpu is med) and (bandwidth is low) and (freespace is ample) then rank is med_high"); MamdaniFuzzyRule rule17 = fsNodeSys.ParseRule("if (cpu is med) and (bandwidth is low) and (freespace is moderate) then rank is med_high"); MamdaniFuzzyRule rule18 = fsNodeSys.ParseRule("if (cpu is med) and (bandwidth is low) and (freespace is low) then rank is low"); MamdaniFuzzyRule rule19 = fsNodeSys.ParseRule("if (cpu is high) and (bandwidth is high) and (freespace is ample) then rank is med"); MamdaniFuzzyRule rule20 = fsNodeSys.ParseRule("if (cpu is high) and (bandwidth is high) and (freespace is moderate) then rank is med_low"); MamdaniFuzzyRule rule21 = fsNodeSys.ParseRule("if (cpu is high) and (bandwidth is high) and (freespace is low) then rank is low"); MamdaniFuzzyRule rule22 = fsNodeSys.ParseRule("if (cpu is high) and (bandwidth is med) and (freespace is ample) then rank is med"); MamdaniFuzzyRule rule23 = fsNodeSys.ParseRule("if (cpu is high) and (bandwidth is med) and (freespace is moderate) then rank is med_low"); MamdaniFuzzyRule rule24 = fsNodeSys.ParseRule("if (cpu is high) and (bandwidth is med) and (freespace is low) then rank is low"); MamdaniFuzzyRule rule25 = fsNodeSys.ParseRule("if (cpu is high) and (bandwidth is low) and (freespace is ample) then rank is med_low"); MamdaniFuzzyRule rule26 = fsNodeSys.ParseRule("if (cpu is high) and (bandwidth is low) and (freespace is moderate) then rank is med"); MamdaniFuzzyRule rule27 = fsNodeSys.ParseRule("if (cpu is high) and (bandwidth is low) and (freespace is low) then rank is low"); fsNodeSys.Rules.Add(rule1); fsNodeSys.Rules.Add(rule2); fsNodeSys.Rules.Add(rule3); fsNodeSys.Rules.Add(rule4); fsNodeSys.Rules.Add(rule5); fsNodeSys.Rules.Add(rule6); fsNodeSys.Rules.Add(rule7); fsNodeSys.Rules.Add(rule8); fsNodeSys.Rules.Add(rule9); fsNodeSys.Rules.Add(rule10); fsNodeSys.Rules.Add(rule11); fsNodeSys.Rules.Add(rule12); fsNodeSys.Rules.Add(rule13); fsNodeSys.Rules.Add(rule14); fsNodeSys.Rules.Add(rule15); fsNodeSys.Rules.Add(rule16); fsNodeSys.Rules.Add(rule17); fsNodeSys.Rules.Add(rule18); fsNodeSys.Rules.Add(rule19); fsNodeSys.Rules.Add(rule20); fsNodeSys.Rules.Add(rule21); fsNodeSys.Rules.Add(rule22); fsNodeSys.Rules.Add(rule23); fsNodeSys.Rules.Add(rule24); fsNodeSys.Rules.Add(rule25); fsNodeSys.Rules.Add(rule26); fsNodeSys.Rules.Add(rule27); var rankedNodes = new Dictionary<NodeInstance, double>(); for (int i = 0; i < nodes.Count; i++) { // // Fuzzify input values // Dictionary<FuzzyVariable, double> inputValues = new Dictionary<FuzzyVariable, double>(); inputValues.Add(fvCPU, nodes[i].CPU_Utilization); inputValues.Add(fvBandwidth, nodes[i].UsedBandwidth / nodes[i].MaxBandwidth); inputValues.Add(fvFreeSpace, nodes[i].FreeSpace / nodes[i].MaxBackupSpace); // // Calculate the result // Dictionary<FuzzyVariable, double> result = fsNodeSys.Calculate(inputValues); double rank = result[fvRank]; rankedNodes.Add(nodes[i], rank); //Console.WriteLine(nodes[i].ToString()); //Console.WriteLine("Rank: " + Math.Round(rank, 2).ToString()); //Console.WriteLine(); } var sortedNodes = (from entry in rankedNodes orderby entry.Value descending select entry) .ToDictionary(pair => pair.Key, pair => pair.Value); return sortedNodes; }
public static double GetResult(MamdaniFuzzySystem fuzzySystem, string outputVariable, params KeyValuePair<string, double>[] inputVariables) { SerializableDictionary<FuzzyVariable, double> inputValues = new SerializableDictionary<FuzzyVariable, double>(); foreach(KeyValuePair<string, double> entry in inputVariables) { inputValues.Add(fuzzySystem.InputByName(entry.Key), entry.Value); } Dictionary<FuzzyVariable, double> result = fuzzySystem.Calculate(inputValues); return result[fuzzySystem.OutputByName(outputVariable)]; }
public static MamdaniFuzzySystem AddRules(MamdaniFuzzySystem fuzzySystem, params string[] rules) { try { foreach(string rule in rules) { fuzzySystem.Rules.Add(FuzzyLogicUtilities.CreateRule(fuzzySystem, rule)); } return fuzzySystem; } catch { return null; } }
public static MamdaniFuzzyRule CreateRule(MamdaniFuzzySystem fuzzySystem, string rule) { try { return fuzzySystem.ParseRule(rule); } catch { return null; } }
public DecisionMakerType1(MamdaniFuzzySystem fuzzySystem, RulesList rulesDefinitions) { this.fsWellEval = fuzzySystem; this.RulesDefinitions = rulesDefinitions; }
private static MamdaniFuzzySystem UpdateParamsByMultiplier( DecisionMakerType1 originalDecisionMaker, double multiplier, VariableMFParam paramToUpdate, out bool canStretchMore) { canStretchMore = false; // Create empty fuzzy system MamdaniFuzzySystem newFs = new MamdaniFuzzySystem(); // Create input and output variables for the system foreach (var inputVariable in originalDecisionMaker.fsWellEval.Input) { FuzzyVariable fsVariable = new FuzzyVariable(inputVariable.Name, inputVariable.Min, inputVariable.Max); foreach (var term in inputVariable.Terms) { var mf = term.MembershipFunction as NormalMembershipFunction; if (paramToUpdate == VariableMFParam.Mean) { if (mf != null && (mf.B * multiplier >= fsVariable.Min && mf.B * multiplier <= fsVariable.Max)) { fsVariable.Terms.Add( new FuzzyTerm(term.Name, new NormalMembershipFunction(mf.B * multiplier, mf.Sigma))); canStretchMore = true; } else { if (mf != null) { fsVariable.Terms.Add(new FuzzyTerm(term.Name, new NormalMembershipFunction(mf.B, mf.Sigma))); canStretchMore = false; } } } if (paramToUpdate == VariableMFParam.Deviation) { if (mf != null && (mf.Sigma * multiplier >= 0.001 && mf.Sigma * multiplier <= 10)) { fsVariable.Terms.Add( new FuzzyTerm(term.Name, new NormalMembershipFunction(mf.B, mf.Sigma * multiplier))); } else { if (mf != null) { fsVariable.Terms.Add(new FuzzyTerm(term.Name, new NormalMembershipFunction(mf.B, mf.Sigma))); } } } if (paramToUpdate == VariableMFParam.RuleWeight) { if (mf != null) { fsVariable.Terms.Add(new FuzzyTerm(term.Name, new NormalMembershipFunction(mf.B, mf.Sigma))); } } } newFs.Input.Add(fsVariable); } foreach (var outputVariable in originalDecisionMaker.fsWellEval.Output) { var newVariable = new FuzzyVariable( outputVariable.Name, outputVariable.Min, outputVariable.Max, outputVariable.Unit); newVariable.Terms.Clear(); newVariable.Terms.AddRange(outputVariable.Terms); newFs.Output.Add(newVariable); } for (int i = 0; i < originalDecisionMaker.RulesDefinitions.Items.Count; i++) { MamdaniFuzzyRule newRule = newFs.ParseRule(originalDecisionMaker.RulesDefinitions.Items[i].Definition); double oldWeight = originalDecisionMaker.fsWellEval.Rules[i].Weight; if (paramToUpdate == VariableMFParam.RuleWeight) { if (oldWeight * multiplier >= 0.001 && oldWeight * multiplier <= 1) { newRule.Weight = oldWeight * multiplier; } } else { newRule.Weight = oldWeight; } newFs.Rules.Add(newRule); } return newFs; }