3-parse-rule #10

Open
romanov73 wants to merge 9 commits from 3-parse-rule into master
3 changed files with 45 additions and 34 deletions
Showing only changes of commit c635efaacf - Show all commits

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

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