#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 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;
}

View File

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

View File

@ -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<String> 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<OutputValue> getFuzzyInference(Map<String, Double> 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<Variable> 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);
}
}