3-parse-rule #10
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user