MII_Labs_Mochalov_PI-33/lab12/main.py

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())