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