#3 -- Fix inference

This commit is contained in:
Anton Romanov 2023-11-06 20:00:06 +04:00
parent 24a59f204d
commit c635efaacf
3 changed files with 45 additions and 34 deletions

View File

@ -10,6 +10,15 @@ public class Term extends BaseEntity {
private double min; private double min;
private double max; 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() { public String getName() {
return name; return name;
} }

View File

@ -19,6 +19,11 @@ public class Variable extends BaseEntity {
this.name = name; this.name = name;
} }
public Variable(String name, List<Term> terms) {
this.name = name;
this.terms = terms;
}
public String getName() { public String getName() {
return name; return name;
} }
@ -34,4 +39,4 @@ public class Variable extends BaseEntity {
public void setTerms(List<Term> terms) { public void setTerms(List<Term> terms) {
this.terms = terms; this.terms = terms;
} }
} }

View File

@ -15,8 +15,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import ru.ulstu.fc.rule.model.OutputValue; 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.Variable;
import ru.ulstu.fc.rule.model.VariableValue;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -32,13 +32,15 @@ public class FuzzyInferenceService {
private final static String NO_RESULT = "Нет результата"; private final static String NO_RESULT = "Нет результата";
private final Engine fuzzyEngine; private final Engine fuzzyEngine;
public FuzzyInferenceService(Engine fuzzyEngine) {
this.fuzzyEngine = fuzzyEngine;
}
private List<String> getDemoRules() { private List<String> getDemoRules() {
return List.of( 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(); final InputVariable input = new InputVariable();
input.setName(variable.getName()); input.setName(variable.getName());
input.setDescription(""); 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.setEnabled(true);
input.setLockValueInRange(false); input.setLockValueInRange(false);
double prev = 0; for (int i = 0; i < variable.getTerms().size(); i++) {
for (int i = 0; i < variable.getValues().size(); i++) { Triangle term = new Triangle(variable.getTerms().get(i).getName(),
Triangle term = new Triangle(variable.getValues().get(i).getFuzzyTerm(), variable.getTerms().get(i).getMin(),
prev, variable.getTerms().get(i).getMax());
variable.getValues().get(i).getValue(),
variable.getValues().get(i).getValue() + variable.getValues().get(i).getValue() - prev);
prev = term.getVertexB();
input.addTerm(term); input.addTerm(term);
} }
return input; return input;
@ -65,20 +64,16 @@ public class FuzzyInferenceService {
final OutputVariable output = new OutputVariable(); final OutputVariable output = new OutputVariable();
output.setName(variable.getName()); output.setName(variable.getName());
output.setDescription(""); 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.setEnabled(true);
output.setAggregation(new Maximum()); output.setAggregation(new Maximum());
output.setDefuzzifier(new WeightedAverage()); output.setDefuzzifier(new WeightedAverage());
output.setDefaultValue(Double.NaN); output.setDefaultValue(Double.NaN);
output.setLockValueInRange(false); output.setLockValueInRange(false);
double prev = 0; for (int i = 0; i < variable.getTerms().size(); i++) {
for (int i = 0; i < variable.getValues().size(); i++) { Triangle term = new Triangle(variable.getTerms().get(i).getName(),
Triangle term = new Triangle( variable.getTerms().get(i).getMin(),
variable.getValues().get(i).getFuzzyTerm(), variable.getTerms().get(i).getMax());
prev,
variable.getValues().get(i).getValue(),
variable.getValues().get(i).getValue() + variable.getValues().get(i).getValue() - prev);
prev = term.getVertexB();
output.addTerm(term); output.addTerm(term);
} }
return output; return output;
@ -124,20 +119,21 @@ public class FuzzyInferenceService {
public List<OutputValue> getFuzzyInference(Map<String, Double> vals) { public List<OutputValue> getFuzzyInference(Map<String, Double> vals) {
return getFuzzyInference(getDemoRules(), vals, return getFuzzyInference(getDemoRules(), vals,
List.of(new Variable("возраст", List.of( List.of(new Variable("возраст", List.of(
new VariableValue("молодой", 35.0), new Term("молодой", 0.0, 40.0),
new VariableValue("средний", 60.0), new Term("средний", 20.0, 60.0),
new VariableValue("старый", 100.0)) new Term("старый", 50.0, 100.0))
), ),
new Variable("доход", List.of( new Variable("доход", List.of(
new VariableValue("небольшой", 35000.0), new Term("небольшой", 0.0, 35000.0),
new VariableValue("средний", 100000.0), new Term("средний", 20000.0, 100000.0),
new VariableValue("высокий", 500000.0)) new Term("высокий", 80000.0, 500000.0))
) )
), ),
new Variable("кредит", List.of( new Variable("кредит", List.of(
new VariableValue("небольшой", 20000.0), new Term("не_выдавать_кредит", 0.0, 1.0),
new VariableValue("средний", 100000.0), new Term("небольшой", 1.0, 50000.0),
new VariableValue("большой", 1000000.0))) new Term("средний", 25000.0, 100000.0),
new Term("большой", 75000.0, 1000000.0)))
); );
} }
@ -146,6 +142,7 @@ public class FuzzyInferenceService {
List<Variable> inputVariables, List<Variable> inputVariables,
Variable outputVariable) { Variable outputVariable) {
fuzzyEngine.getRuleBlocks().clear(); fuzzyEngine.getRuleBlocks().clear();
fuzzyEngine.addRuleBlock(getRuleBlock(fuzzyEngine, getDemoRules())); return getConsequent(engine, values); fuzzyEngine.addRuleBlock(getRuleBlock(fuzzyEngine, rules, inputVariables, outputVariable));
return getConsequent(fuzzyEngine, values);
} }
} }