#3 -- Fix inference
This commit is contained in:
parent
24a59f204d
commit
c635efaacf
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user