Wpis z mikrobloga

Szukam algorytmu (najlepiej w pythonicznego) który by zestawił ze sobą dwie grupy produktów w taki sposób aby produkty najbardziej pasujące do siebie były u góry listy (a najmniej pasujące na dole).

Na przykład:

(a, b, c, d to parametry Produktu):

Grupa produktów 1:
P1: a,b
P2: c,d

Grupa produktów 2:
P3: a,d
P4: c,d

Efekt zestawienia ma wyglądać tak:
1. P2 c,d = c,d P4 (pełne dopasowanie)
2. P1 a,b = a,d P3 (częściowe dopasowanie)
3. P2 c,d = a,d P3 (częściowe dopasowanie)
4. P1 a,b = None (brak dopasowania)
5. None = c,d P4 (brak dopasowania)

Czy ktoś ma pomysł jak to zrobić?

(oczywiście dwa parametry to tylko przykład - ostatecznie parametrów będzie więcej ~kilkanaście)

#programowanie #python
  • 13
@soma115:

1) a, b, c i d to prawdzie parametry które przyjmują jakieś wartości, np. moc czajnika albo jego pojemność? czy też są te cechy, które charakteryzują się tym, że są albo ich nie ma: czajnik stalowy, czajnik czarny, produkt polski

2) następnie spisz wszystkie zasady którymi rządzi się ocenianie, czy cechy są dokładnie tak samo ważne czy któreś cechy mają większą wagę. Czy produkty same w sobie są równie ważne,
@meohaw:

1) Dla uproszczenia - jest/nie ma.

2) Cechy są tak samo ważne. Liczy się tylko to ile z nich pasuje do siebie.

3) odpada

5) To jest sedno mojego pytania. Chciałbym uniknąć porównywania każdej cechy każdego produktu z Grupy 1 z każdą cechą każdego produktu z Grupy 2. Wydaje mi się to mało eleganckie ponieważ powstanie z tego jakiś hiper-iloczyn-kartezjański. Zrobię to tylko jeśli nie będzie innego wyjścia ale i
@soma115:

Cała idea polega na tym, że wyrażasz podobieństwo produktów jako liczba.
Przykład (odrobinę z dupy) - Masz 5 cech (czyli coś jest albo czegoś nie ma) które mogą przyjmować produkty. Budujesz z nich maskę (taką listę True / False)

Item1 - True False True False True
Item2 - True False True False False
Item3 - True True True True True

Teraz zadajesz sobie pytanie czy brak jakiejś cechy w dwóch
@meohaw: Źle zrozumiałem twoje pytanie - te cechy nie mogą być aż takie proste (True/False). Muszą to być wartości typu aaa, bbb, ccc, czyli stringi ale ze skończonej listy (a nie wpisywane z palca).
@meohaw:

Grupa 1:
- koszulka, niebieska, xxl
- kubek, zielony, 0,33L
- buty, skórzane, 45

Grupa 2:
- koszulka, zielona, xxl
- szklanka, przezroczysta, 0,33L
- buty, skórzane, 45

Dodając produkt można wybrać go tylko z listy. Jego cechy też tylko z już istniejącej listy cech.
@meohaw:

Grupa 1 to potrzeby. Grupa 2 to oferty. Trzeba zmaczować oferty z potrzebami. Czyli w ostatnim przykładzie wynik powinien wyglądać tak:

1. buty, skórzane, 45 = buty, skórzane, 45
2. koszulka, niebieska, xxl = koszulka, zielona, xxl
3. kubek, zielony, 0,33L = szklanka, przezroczysta, 0,33L

Eeee, trochę mi się tu przykład rozjechał bo każdy produkt ma cechę dominującą. Np. Buty mogą być porównywane tylko z butami. A zatem kubek to
@soma115: Jeżeli zignorować, że produkty są różnych klas, to maski cech dalej działają.

Lista cech - koszulka, kubek, szklanka, buty, niebieskie, zielone, skórzane, przeźroczyste, XXL, 0.33L, 45
Item1 - True, False, False, False, True, False, False, False, True, False, False
Item2 - False, True, False, False, False, True, False, False, False, True, False
Item3 - False, False, False, True, False, False, True, False, False, False, True
itd.
itp.

I jak sobie
@meohaw: ok, twój pomysł pasuje do koncepcji ale ujmę to tak:
Jeśli cecha potrzeby jest identyczna z cechą oferty to do danej pary potrzeba-oferta dodaję 1. Jeśli więc w danej parze potrzeba-oferta pasują do siebie 3 cechy to rekord uzyska 3 punkty. Potem wystarczy uszeregować rekordy według liczby punktów. Tak! To jest to! :)

@ZapomnialWieprzJakProsiakiemByl: Cechy są na sztywno.
To jest django więc o ile dobrze rozumiem jest to queryset.