106 lines
4.4 KiB
Python
106 lines
4.4 KiB
Python
from FuzzyRule import FuzzyRule
|
|
from LinguisticVariable import LinguisticVariable
|
|
|
|
|
|
def get_linguistic_data(vars: list[LinguisticVariable], x: dict[str, float]) -> dict[str, dict[str, float]]:
|
|
return {i.name: i.get_all_supplies(x[i.name]) for i in vars}
|
|
|
|
|
|
def get_rule_table_res(rules: list[FuzzyRule], vars: list[LinguisticVariable], x: dict[str, float]) \
|
|
-> (str, str, float):
|
|
res = [i.calculate_res(get_linguistic_data(vars, x)) for i in rules]
|
|
|
|
return sorted(res, key=lambda y: -y[2])[0]
|
|
|
|
|
|
if __name__ == '__main__':
|
|
variables: list[LinguisticVariable] = [
|
|
LinguisticVariable("Часы эксплуатации")
|
|
.add_fuzzy_set("мало", 0, 0, 100, 200)
|
|
.add_fuzzy_set("средне", 100, 300, 500, 700)
|
|
.add_fuzzy_set("много", 500, 800, 1000, 1000),
|
|
|
|
LinguisticVariable("Срок последней проверки")
|
|
.add_fuzzy_set("недавно", 0, 0, 3, 6)
|
|
.add_fuzzy_set("давно", 3, 6, 12, 18)
|
|
.add_fuzzy_set("очень давно", 12, 18, 24, 24),
|
|
|
|
LinguisticVariable("Риск поломки")
|
|
.add_fuzzy_set("низкий", 0, 0, 20, 40)
|
|
.add_fuzzy_set("средний", 20, 40, 60, 80)
|
|
.add_fuzzy_set("высокий", 60, 80, 100, 100)
|
|
]
|
|
|
|
rules: list[FuzzyRule] = [
|
|
FuzzyRule()
|
|
.add_condition("Часы эксплуатации", 'мало')
|
|
.add_condition("Срок последней проверки", 'недавно')
|
|
.add_resout("Риск поломки", 'низкий'),
|
|
|
|
FuzzyRule()
|
|
.add_condition("Часы эксплуатации", 'мало')
|
|
.add_condition("Срок последней проверки", 'давно')
|
|
.add_resout("Риск поломки", 'низкий'),
|
|
|
|
FuzzyRule()
|
|
.add_condition("Часы эксплуатации", 'мало')
|
|
.add_condition("Срок последней проверки", 'очень давно')
|
|
.add_resout("Риск поломки", 'средний'),
|
|
|
|
FuzzyRule()
|
|
.add_condition("Часы эксплуатации", 'средне')
|
|
.add_condition("Срок последней проверки", 'недавно')
|
|
.add_resout("Риск поломки", 'низкий'),
|
|
|
|
FuzzyRule()
|
|
.add_condition("Часы эксплуатации", 'средне')
|
|
.add_condition("Срок последней проверки", 'давно')
|
|
.add_resout("Риск поломки", 'средний'),
|
|
|
|
FuzzyRule()
|
|
.add_condition("Часы эксплуатации", 'средне')
|
|
.add_condition("Срок последней проверки", 'очень давно')
|
|
.add_resout("Риск поломки", 'высокий'),
|
|
|
|
FuzzyRule()
|
|
.add_condition("Часы эксплуатации", 'много')
|
|
.add_condition("Срок последней проверки", 'недавно')
|
|
.add_resout("Риск поломки", 'средний'),
|
|
|
|
FuzzyRule()
|
|
.add_condition("Часы эксплуатации", 'много')
|
|
.add_condition("Срок последней проверки", 'давно')
|
|
.add_resout("Риск поломки", 'высокий'),
|
|
|
|
FuzzyRule()
|
|
.add_condition("Часы эксплуатации", 'много')
|
|
.add_condition("Срок последней проверки", 'очень давно')
|
|
.add_resout("Риск поломки", 'высокий'),
|
|
|
|
FuzzyRule()
|
|
.add_condition("Часы эксплуатации", 'мало')
|
|
.add_condition("Срок последней проверки", 'недавно')
|
|
.add_resout("Риск поломки", 'низкий'),
|
|
|
|
FuzzyRule()
|
|
.add_condition("Часы эксплуатации", 'много')
|
|
.add_condition("Срок последней проверки", 'недавно')
|
|
.add_resout("Риск поломки", 'средний')
|
|
]
|
|
|
|
input_data: dict[str, float] = {
|
|
"Часы эксплуатации": 550,
|
|
"Срок последней проверки": 15
|
|
}
|
|
|
|
varz = []
|
|
for i in variables:
|
|
if i.name in input_data:
|
|
varz.append(i)
|
|
|
|
name, value, confidence = get_rule_table_res(rules, varz, input_data)
|
|
print(name, value)
|
|
for i in variables:
|
|
if i.name == name:
|
|
print(i.fuzzy_sets[value].defuzzification())
|