import numpy as np import skfuzzy as fuzz from numpy.core._multiarray_umath import ndarray from skfuzzy import control as ctrl import matplotlib.pyplot as plt from matplotlib import cm # # Wejścia do systemu - deklarowana dziedzina dla zmiennych # obiekt Antecedent przechowuje wartość dziedziny dla zmiennych wejściowych # obiekt Consequent przechowuje wartość dziedziny dla zmiennych wyjściowych quality = ctrl.Antecedent(np.arange(0, 11, 1), 'quality') service = ctrl.Antecedent(np.arange(0, 11, 1), 'service') tip = ctrl.Consequent(np.arange(0, 31, 1), 'tip') # Automatyczne generowanie funkcji przynależności dla wejść w liczbie .automf(3, 5, or 7) # Liczba funkcji wpływa na liczbę reguł quality.automf(3) service.automf(3) # Ręczne budowanie funkcji przynależności dla wyjścia tip['low'] = fuzz.trimf(tip.universe, [0, 5, 10]) tip['medium'] = fuzz.trimf(tip.universe, [10, 15, 20]) tip['high'] = fuzz.trimf(tip.universe, [20, 25, 30]) # Wizualizacja wejść i wyjścia service.view() quality.view() tip.view() # Baza wiedzy z regułami rozmytymi rule1 = ctrl.Rule(quality['poor'] | service['poor'], tip['low']) rule2 = ctrl.Rule(service['average'], tip['medium']) rule3 = ctrl.Rule(quality['good'] | service['good'], tip['high']) # rule1 = ctrl.Rule(quality['poor'] & service['poor'], tip['low']) # rule2 = ctrl.Rule(quality['poor'] & service['average'], tip['low']) # rule3 = ctrl.Rule(service['average'] & quality['average'], tip['medium']) # rule4 = ctrl.Rule(service['good'] & quality['good'], tip['high']) # rule5 = ctrl.Rule(service['average'] & quality['good'], tip['high']) # rule6 = ctrl.Rule(service['good'] & quality['average'], tip['high']) #rule1.view() # Model rozmyty w oparciu o trzy reguły tipping_ctrl = ctrl.ControlSystem([rule1, rule2, rule3]) #Obliczenie wyjść (symulacja systemu) dla obiektu tipping_ctrl tipping = ctrl.ControlSystemSimulation(tipping_ctrl) # Przekazuj dane wejściowe do ControlSystem używając etykiet Antecedent # Jeśli chcesz przekazać wiele danych wejściowych naraz, użyj .inputs(dict_of_data) tipping.input['quality'] = 6.5 tipping.input['service'] = 9.8 # Oblicz wyjście tipping.compute() print ("Obliczony napiwek wynosi:", tipping.output['tip'].round(2)) tip.view(sim=tipping) # Wykreślenie płaszczyzny modelu qu = np.arange(0, 10.25, 0.25) ser = np.arange(0, 10.25, 0.25) qu, ser = np.meshgrid(qu, ser) predicted_val: ndarray = np.zeros(shape=(len(ser),len(qu))) for i in range(len(qu)): for j in range(len(ser)): #print(qu[i,j],ser[i,j]) tipping.input['quality'] = qu[i,j] tipping.input['service'] = ser[i,j] tipping.compute() predicted_val[i,j] = tipping.output['tip'] # Wykreślenie wykresu trójwymiarowego fig = plt.figure() ax = fig.gca(projection='3d') surf = ax.plot_surface(qu, ser, predicted_val, cmap=cm.coolwarm, linewidth=0, antialiased=False) fig.colorbar(surf, shrink=0.5, aspect=5) plt.show()