Come deve corrispondere un app store matchmaking per ciascun utente?

1

Qual è il modo più efficiente per archiviare le partite di ciascun utente in un'app / sito web di matchmaking? Data la complessità di questo tipo di algoritmi, è ragionevole calcolare sempre le corrispondenze, al volo, quando un utente effettua l'accesso o preme il pulsante di ricerca e successivamente ignora i risultati dopo che se ne sono andati?

Se ciò non va bene per un'applicazione ragionevolmente grande, quindi memorizzare tutte le partite per ciascun utente può essere una sfida anche se ci sono più di pochi milioni di utenti registrati.

Limita le potenziali corrispondenze, come max. 100 partite per utente o ricerca solo tra utenti che vivono in questa città, è la strada da percorrere o ci sono modi migliori per ottenere risultati di corrispondenza completi e memorizzarli per ogni utente?

Inoltre, come si potrebbe progettare una struttura di database per memorizzare i risultati? Un documento NoSQL che memorizza le corrispondenze di chiunque nel proprio documento o solo una tabella relazionale che memorizza la percentuale di corrispondenza di due utenti in un singolo record e la ripete per tutte le corrispondenze?

Aggiornamento

Come funziona l'algoritmo matchmaking: se diciamo che A, B e C sono tutti utenti, calcola innanzitutto quante risposte e preferenze di B soddisfano A, quindi calcola quanto le risposte di A soddisfino B, quindi ottiene la media geometrica di questi due numeri, che vengono quindi contrassegnati come la percentuale di corrispondenza effettiva tra A e B. Quindi ripeterebbe questo per A e C e poi B e C.

    
posta Mahdi 21.11.2016 - 12:04
fonte

4 risposte

2

Non memorizzerei le corrispondenze.

Invece, determinerei "le caratteristiche che contano" e ho un campo di bit per ognuna. Ad esempio, potresti decidere "maschio o meno", quindi hai un bitfield per questo, e se la prima voce è per un maschio, imposti bit0, e se la seconda voce è per un maschio, imposti bit1, e così via . Quindi potresti decidere anche "oltre 40", quindi crei un altro bitfield per quello, e se la prima voce è per qualcuno sopra i 40, imposti bit0, e se la seconda è per qualcuno sopra i 40, imposti bit1, ecc.

Ora se vuoi cercare "maschi sopra i 40" ottieni il bitfield per "maschio" e il bitfield per "over 40" e tu E loro; dandoti un bitfield che rappresenta "i maschi oltre i 40".

Se fatto correttamente; un laptop economico dovrebbe essere in grado di gestire milioni di partite al secondo.

    
risposta data 21.11.2016 - 12:32
fonte
1

In realtà ho creato un sito di "appuntamenti" qualche tempo fa con un algoritmo di corrispondenza simile. Quello che ho imparato dalla costruzione di quel sito:

  • Dovrai memorizzare nella cache i risultati della tua corrispondenza
  • Riduci il tuo problema assicurandoti di tenere conto dell'orientamento sessuale. Ad esempio sarebbe una perdita di tempo per l'utente essere abbinato a un genere a cui non sono interessati.
  • Dai la priorità ai calcoli delle corrispondenze che si adattano strettamente all'interno delle preferenze dell'utente (fascia d'età, religione, distanza dall'utente, ecc.). Assicurati anche di controllare le preferenze in entrambi i modi (UtenteA - > UtenteB e UtenteB < - UtenteA). L'Utente A potrebbe non interessarsi alla religione ma all'Utente B potrebbe interessare molto.

In sostanza si lavora per ridurre il problema impostato, quindi dare la priorità al proprio lavoro. In questo modo non passi molto tempo a calcolare un milione di partite per UserA mentre altri 10 utenti non hanno ancora calcolato alcuna corrispondenza.

Abbiamo fatto una sorta di round robin in cui dovevamo calcolare un certo numero di partite per ciascun utente prima di passare a quello successivo. Questo era davvero necessario solo durante il primo mese in cui il sito è stato bombardato da persone che si sono iscritte.

Speriamo che questo ti aiuti.

    
risposta data 15.12.2016 - 19:46
fonte
0

A seconda del tipo di partite di cui stiamo parlando, potresti essere in grado di registrare quali partite sono state fatte e con quali criteri. In questo caso, potrebbe essere utile un record intermedio per queste corrispondenze.

Specialmente se le proprietà su cui agisce l'algoritmo di matching possono cambiare, potrebbe essere impossibile ottenere un risultato riproducibile.

Vorrei andare con la memorizzazione delle partite. Puoi quindi anche registrare altre informazioni, ad esempio se gli utenti corrispondenti sono d'accordo con la corrispondenza, il che ti aiuterà a migliorare la corrispondenza.

    
risposta data 21.11.2016 - 14:05
fonte
0

Devi elaborare con attenzione come vengono create le corrispondenze prima di decidere come memorizzarle. Quando saprai come vengono create esattamente le partite, le domande sullo storage saranno più facili e più ovvie da gestire. Aspettatevi una combinazione di vari approcci da utilizzare:

  1. In viaggio. Modifica di un insieme di regole di marketing (test A / B, campagne di promozione) che definiscono un insieme di [non] corrispondenze in base agli attributi dell'utente, al momento, al dispositivo dell'utente, agli ordini precedenti, ecc.
  2. Off-line. Algoritmi di punteggio in esecuzione una volta ogni ora / giorno / mese e produzione di corrispondenze per utente / gruppo di marketing.

In genere è preferibile calcolare in movimento per consentire la massima flessibilità. E solo quando si verifica un problema di prestazioni sposta una parte del calcolo nell'algoritmo off-line.

Ricorda che oltre ad avere solo un elenco di corrispondenze per utente, spesso hai bisogno di una sorta di priorità tra loro.

    
risposta data 21.11.2016 - 14:38
fonte

Leggi altre domande sui tag