From 12cfca95bc9cd8606d28dec58baa5ccbeb753eb3 Mon Sep 17 00:00:00 2001 From: Tomek Date: Tue, 19 May 2020 19:42:55 +0200 Subject: [PATCH] Dodanie raportu do podprojektu --- Raport_444420.md | 159 ++++++++++++++++++++++++++++++ __pycache__/mcda.cpython-38.pyc | Bin 2384 -> 2384 bytes __pycache__/supply.cpython-38.pyc | Bin 1288 -> 1288 bytes mcda.py | 1 - 4 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 Raport_444420.md diff --git a/Raport_444420.md b/Raport_444420.md new file mode 100644 index 0000000..01c7b80 --- /dev/null +++ b/Raport_444420.md @@ -0,0 +1,159 @@ +# Tomasz Kuczyński Raport - mcda + +### Opis podprojektu +Podprojekt ma za zadanie wybrać określoną liczbę najlepszych produktów z dostawy. +Wykorzystuj on zmodyfikowaną motodę MCDA - Multiple Criteria Decision Analysis. + +#### Uczenie modelu +Zbiór uczenia składa się z zdefiniowania wartości atrybutów: + +```javascript +color = {'black': 16, 'gold': 10, 'purple': 5, 'brown': 7, 'blue': 12, 'white': 14, 'red': 13, 'orange': 11} +shape = {'rectangle': 15, 'pack': 19, 'square': 9, 'jar': 7} +size = {'small': 7, 'medium': 16, 'big': 13} +``` +oraz ich wyliczenia: +```javascript +def sizeValue(X): + if X.size == 'small': + return X.mass/5 + if X.size == 'medium': + return X.mass/10 + if X.size == 'big': + return X.mass/20 +``` + +Składa się róznierz z parametrów: +`weights` - waga danego parametru +`q` - współczynik pomyłki (granicy błędu) pomiędzy atrybutami +`p` - maksymalna dopuszczalna różnica pomiędy atrybutami + +```javascript +parameters = { + 'color': {'weights': 3, 'q': 1, 'p': 5}, + 'shape': {'weights': 4, 'q': 1, 'p': 6}, + 'mass': {'weights': 0.5, 'q': 2, 'p': 10}, + 'size': {'weights': 1, 'q': 1, 'p': 8} +} +``` + +#### Opis kodu w wspólnym projekcie +W wspólnym projekcie w pliku main.py wywołuje funkcję wybierania 5 produktów z dostawy: + +```javascript +produsctsFromSupply = choseProducts(5) +``` + +próbna dostawa jest zapisana w pliku supply.py: + +```javascript +def create_data_products(): + allProducts = [] + + product = Product('black', 'rectangle', 51, 'small') + allProducts.append(product) + product = Product('black', 'rectangle', 51, 'small') + allProducts.append(product) + product = Product('gold', 'pack', 100, 'big') + allProducts.append(product) + ... + return allProducts + +``` + +Cały algorytm selekcji produktów znajduje się w pliku mcda.py. + +Funkcja `getConcordance(gA, gB, q, p):` ma za zadanie wyliczyć `Concordance` czyli jakość produktu A względem produktu B, za pomocą wartości atrybutów A, B odpowiednio gA, gB oraz parametrów tego atrybutu q, p i zwrócić liczbę z zakresu [0,1]. + +```javascript +def getConcordance(gA, gB, q, p): + if gB <= gA + q: + return 1 + if gB <= gA + p: + return (p - gB + gA) / (p - q) + return 0 +``` + +Funkcja `getAllTypeConcordance(A, B)` ma za zadanie wyliczyć wszystkie typy `Concordance` oraz wyliczyć ich średnią ważoną: + +```javascript +def getAllTypeConcordance(A, B): + concordance = 0.0 + weight_sum = 0 + + parameter = parameters['color'] + w, q, p = parameter['weights'], parameter['q'], parameter['p'] + concordance += getConcordance(color[A.color], color[B.color], q, p) * w + weight_sum += w + + parameter = parameters['shape'] + w, q, p = parameter['weights'], parameter['q'], parameter['p'] + concordance += getConcordance(shape[A.shape], shape[B.shape], q, p) * w + weight_sum += w + ... + concordance /= weight_sum + return concordance +``` + +Funkcja `getConcordanceAllProducts()` ma za zadanie przy pomocy funkcji `getAllTypeConcordance(A, B)` wyliczyć `Concordance` dla wszystkich produktów i zwrócić wynik w postaci listy: + +```javascript +def getConcordanceAllProducts(): + C = [] + + for i in range(len(allProducts)): + c = 0 + for j in range(len(allProducts)): + if j==i: + continue + else: + c += getAllTypeConcordance(allProducts[i], allProducts[j]) + c /= len(allProducts)-1 + C.append(c) + return C +``` + +Funkcja `choseProducts(number)` ma za zadanie wybrać `number` produktów z dostawy na podstawie listy `Concordance` zwróconej przez funkcję `getConcordanceAllProducts()`. + +```javascript +def choseProducts(number): + C = getConcordanceAllProducts() + products = [] + prev = -1 + if number > len(allProducts): + return allProducts + while number > 0: + max = -1 + if prev == -1: + max = 0 + for j in range(len(allProducts)): + if prev == -1: + if C[max]C[j]: + max = j + elif C[max] < C[j] and C[j] < C[prev]: + max = j + prev = max + for j in range(len(allProducts)): + if C[max] == C[j]: + products.append(allProducts[j]) + print(C[j]) + number -= 1 + if number == 0: + break + print(C) + return products +``` + +`print(C[j])` oraz `print(C)` służy do sprawdzenia poprawności algorytmu. + +### Uruchomienie algorytmu i jego działanie +Film przedstawiający uruchomienie aplikacji: +https://www.youtube.com/watch?v=DmwDlJkjtjs +Parametry pojawiające się w terminalu: +1.Concordance `number` najlepszych produktów (`print(C[j])`). +2.Lista wszystkich Concordance ( `print(C)`). + + diff --git a/__pycache__/mcda.cpython-38.pyc b/__pycache__/mcda.cpython-38.pyc index 4a133b5fdd1c590041e86e23dc4b463c829f22fa..79e10a93b034ae505ce236949eb877dffbb5834c 100644 GIT binary patch delta 37 rcmca0bU}zWl$V!_0SLJHkHqzFfquI<>lpK0D|MfM>cZ*WdQ&y$OQxd delta 20 acmeC+>fquI<>lpK00O)Fhc|NnWdQ&z%mqdO diff --git a/mcda.py b/mcda.py index 742828c..68dd463 100644 --- a/mcda.py +++ b/mcda.py @@ -55,7 +55,6 @@ def getAllTypeConcordance(A, B): return concordance def getConcordanceAllProducts(): - C = [] for i in range(len(allProducts)):