From c635efaacfcd9bd43944f5f614dfbe63f7e1583f Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Mon, 6 Nov 2023 20:00:06 +0400 Subject: [PATCH] #3 -- Fix inference --- .../java/ru/ulstu/fc/rule/model/Term.java | 9 +++ .../java/ru/ulstu/fc/rule/model/Variable.java | 7 ++- .../rule/service/FuzzyInferenceService.java | 63 +++++++++---------- 3 files changed, 45 insertions(+), 34 deletions(-) diff --git a/src/main/java/ru/ulstu/fc/rule/model/Term.java b/src/main/java/ru/ulstu/fc/rule/model/Term.java index a0b5580..6b7b917 100644 --- a/src/main/java/ru/ulstu/fc/rule/model/Term.java +++ b/src/main/java/ru/ulstu/fc/rule/model/Term.java @@ -10,6 +10,15 @@ public class Term extends BaseEntity { private double min; private double max; + public Term() { + } + + public Term(String name, double min, double max) { + this.name = name; + this.min = min; + this.max = max; + } + public String getName() { return name; } diff --git a/src/main/java/ru/ulstu/fc/rule/model/Variable.java b/src/main/java/ru/ulstu/fc/rule/model/Variable.java index 8101f53..265e189 100644 --- a/src/main/java/ru/ulstu/fc/rule/model/Variable.java +++ b/src/main/java/ru/ulstu/fc/rule/model/Variable.java @@ -19,6 +19,11 @@ public class Variable extends BaseEntity { this.name = name; } + public Variable(String name, List terms) { + this.name = name; + this.terms = terms; + } + public String getName() { return name; } @@ -34,4 +39,4 @@ public class Variable extends BaseEntity { public void setTerms(List terms) { this.terms = terms; } -} +} \ No newline at end of file diff --git a/src/main/java/ru/ulstu/fc/rule/service/FuzzyInferenceService.java b/src/main/java/ru/ulstu/fc/rule/service/FuzzyInferenceService.java index 6082ebe..17257e4 100644 --- a/src/main/java/ru/ulstu/fc/rule/service/FuzzyInferenceService.java +++ b/src/main/java/ru/ulstu/fc/rule/service/FuzzyInferenceService.java @@ -15,8 +15,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import ru.ulstu.fc.rule.model.OutputValue; +import ru.ulstu.fc.rule.model.Term; import ru.ulstu.fc.rule.model.Variable; -import ru.ulstu.fc.rule.model.VariableValue; import java.util.List; import java.util.Map; @@ -32,13 +32,15 @@ public class FuzzyInferenceService { private final static String NO_RESULT = "Нет результата"; private final Engine fuzzyEngine; + public FuzzyInferenceService(Engine fuzzyEngine) { + this.fuzzyEngine = fuzzyEngine; + } + private List getDemoRules() { return List.of( - String.format(RULE_TEMPLATE, "возраст", "молодой", "доход", "высокий", "большой"), - String.format(RULE_TEMPLATE, "возраст", "средний", "доход", "высокий", "средний"), - String.format(RULE_TEMPLATE, "возраст", "старый", "доход", "высокий", "средний"), - String.format(RULE_TEMPLATE, "возраст", "старый", "доход", "небольшой", "небольшой"), - String.format(RULE_TEMPLATE, "возраст", "молодой", "доход", "небольшой", "небольшой") + String.format(RULE_TEMPLATE, "возраст", "молодой", "доход", "высокий", "средний"), + String.format(RULE_TEMPLATE, "возраст", "средний", "доход", "высокий", "большой"), + String.format(RULE_TEMPLATE, "возраст", "старый", "доход", "средний", "средний") ); } @@ -46,16 +48,13 @@ public class FuzzyInferenceService { final InputVariable input = new InputVariable(); input.setName(variable.getName()); input.setDescription(""); - input.setRange(0, variable.getValues().get(variable.getValues().size() - 1).getValue()); + input.setRange(0, variable.getTerms().get(variable.getTerms().size() - 1).getMax()); input.setEnabled(true); input.setLockValueInRange(false); - double prev = 0; - for (int i = 0; i < variable.getValues().size(); i++) { - Triangle term = new Triangle(variable.getValues().get(i).getFuzzyTerm(), - prev, - variable.getValues().get(i).getValue(), - variable.getValues().get(i).getValue() + variable.getValues().get(i).getValue() - prev); - prev = term.getVertexB(); + for (int i = 0; i < variable.getTerms().size(); i++) { + Triangle term = new Triangle(variable.getTerms().get(i).getName(), + variable.getTerms().get(i).getMin(), + variable.getTerms().get(i).getMax()); input.addTerm(term); } return input; @@ -65,20 +64,16 @@ public class FuzzyInferenceService { final OutputVariable output = new OutputVariable(); output.setName(variable.getName()); output.setDescription(""); - output.setRange(0, variable.getValues().get(variable.getValues().size() - 1).getValue()); + output.setRange(0, variable.getTerms().get(variable.getTerms().size() - 1).getMax()); output.setEnabled(true); output.setAggregation(new Maximum()); output.setDefuzzifier(new WeightedAverage()); output.setDefaultValue(Double.NaN); output.setLockValueInRange(false); - double prev = 0; - for (int i = 0; i < variable.getValues().size(); i++) { - Triangle term = new Triangle( - variable.getValues().get(i).getFuzzyTerm(), - prev, - variable.getValues().get(i).getValue(), - variable.getValues().get(i).getValue() + variable.getValues().get(i).getValue() - prev); - prev = term.getVertexB(); + for (int i = 0; i < variable.getTerms().size(); i++) { + Triangle term = new Triangle(variable.getTerms().get(i).getName(), + variable.getTerms().get(i).getMin(), + variable.getTerms().get(i).getMax()); output.addTerm(term); } return output; @@ -124,20 +119,21 @@ public class FuzzyInferenceService { public List getFuzzyInference(Map vals) { return getFuzzyInference(getDemoRules(), vals, List.of(new Variable("возраст", List.of( - new VariableValue("молодой", 35.0), - new VariableValue("средний", 60.0), - new VariableValue("старый", 100.0)) + new Term("молодой", 0.0, 40.0), + new Term("средний", 20.0, 60.0), + new Term("старый", 50.0, 100.0)) ), new Variable("доход", List.of( - new VariableValue("небольшой", 35000.0), - new VariableValue("средний", 100000.0), - new VariableValue("высокий", 500000.0)) + new Term("небольшой", 0.0, 35000.0), + new Term("средний", 20000.0, 100000.0), + new Term("высокий", 80000.0, 500000.0)) ) ), new Variable("кредит", List.of( - new VariableValue("небольшой", 20000.0), - new VariableValue("средний", 100000.0), - new VariableValue("большой", 1000000.0))) + new Term("не_выдавать_кредит", 0.0, 1.0), + new Term("небольшой", 1.0, 50000.0), + new Term("средний", 25000.0, 100000.0), + new Term("большой", 75000.0, 1000000.0))) ); } @@ -146,6 +142,7 @@ public class FuzzyInferenceService { List inputVariables, Variable outputVariable) { fuzzyEngine.getRuleBlocks().clear(); - fuzzyEngine.addRuleBlock(getRuleBlock(fuzzyEngine, getDemoRules())); return getConsequent(engine, values); + fuzzyEngine.addRuleBlock(getRuleBlock(fuzzyEngine, rules, inputVariables, outputVariable)); + return getConsequent(fuzzyEngine, values); } }