84 lines
3.2 KiB
Python
84 lines
3.2 KiB
Python
import numpy as np
|
|
import skfuzzy as fuzz
|
|
from skfuzzy import control as ctrl
|
|
from django.conf import settings
|
|
|
|
|
|
def get_fuzzy_response(request_params, objects_list):
|
|
|
|
# Stworzenie uniwersum
|
|
production_year = ctrl.Antecedent(np.arange(1960, 2022, 1), "production_year")
|
|
mileage = ctrl.Antecedent(np.arange(0, 500000, 1), "mileage")
|
|
engine_capacity = ctrl.Antecedent(np.arange(0.7, 8.2, 0.1), "engine_capacity")
|
|
combustion = ctrl.Antecedent(np.arange(4.0, 15.0, 0.1), "combustion")
|
|
|
|
# Tworzenie funkcji rozmytych
|
|
production_year["low"] = fuzz.trimf(
|
|
production_year.universe, settings.PRODUCTION_YEAR["low"]
|
|
)
|
|
production_year["mid"] = fuzz.trimf(
|
|
production_year.universe, settings.PRODUCTION_YEAR["mid"]
|
|
)
|
|
production_year["high"] = fuzz.trimf(
|
|
production_year.universe, settings.PRODUCTION_YEAR["high"]
|
|
)
|
|
|
|
mileage["low"] = fuzz.trimf(mileage.universe, settings.MILEAGE["low"])
|
|
mileage["mid"] = fuzz.trimf(mileage.universe, settings.MILEAGE["mid"])
|
|
mileage["high"] = fuzz.trimf(mileage.universe, settings.MILEAGE["high"])
|
|
|
|
engine_capacity["low"] = fuzz.trimf(
|
|
engine_capacity.universe, settings.ENGINE_CAPACITY["low"]
|
|
)
|
|
engine_capacity["mid"] = fuzz.trimf(
|
|
engine_capacity.universe, settings.ENGINE_CAPACITY["mid"]
|
|
)
|
|
engine_capacity["high"] = fuzz.trimf(
|
|
engine_capacity.universe, settings.ENGINE_CAPACITY["high"]
|
|
)
|
|
|
|
combustion["low"] = fuzz.trimf(combustion.universe, settings.COMBUSTION["low"])
|
|
combustion["mid"] = fuzz.trimf(combustion.universe, settings.COMBUSTION["mid"])
|
|
combustion["high"] = fuzz.trimf(combustion.universe, settings.COMBUSTION["high"])
|
|
|
|
# Obliczanie przynaleznosci danego obiektu do podanych danych kwerendy i tworzenie przefiltrowanej listy
|
|
end_object_list = []
|
|
for car in objects_list:
|
|
comparator = []
|
|
if "production_year" in request_params:
|
|
comparator.append(
|
|
fuzz.interp_membership(
|
|
production_year.universe,
|
|
production_year[str(request_params["production_year"])].mf,
|
|
car.production_year,
|
|
)
|
|
)
|
|
if "mileage" in request_params:
|
|
comparator.append(
|
|
fuzz.interp_membership(
|
|
mileage.universe,
|
|
mileage[str(request_params["mileage"])].mf,
|
|
car.mileage,
|
|
)
|
|
)
|
|
if "engine_capacity" in request_params:
|
|
comparator.append(
|
|
fuzz.interp_membership(
|
|
engine_capacity.universe,
|
|
engine_capacity[str(request_params["engine_capacity"])].mf,
|
|
car.engine_capacity,
|
|
)
|
|
)
|
|
if "combustion" in request_params:
|
|
comparator.append(
|
|
fuzz.interp_membership(
|
|
combustion.universe,
|
|
combustion[str(request_params["combustion"])].mf,
|
|
car.combustion,
|
|
)
|
|
)
|
|
if comparator and min(comparator) > settings.COMPARATOR:
|
|
end_object_list.append(car)
|
|
|
|
return end_object_list
|