4.9 KiB
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:
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:
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
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:
produsctsFromSupply = choseProducts(5)
próbna dostawa jest zapisana w pliku supply.py:
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].
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ą:
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:
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()
.
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 max == -1:
if C[prev]>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)
).