// Functia principala de calcul a Recomandarilor. public static List<Preparat> Recomandari(int id_user, Comanda comanda_actuala, int k) { IstoricComenzi istoric = DatabaseFunctions.getIstoric(id_user); List<Comanda> istoric_comenzi = istoric.ListaComenzi; List<Preparat> recomandari=null; if (istoric_comenzi.Count > 0) { recomandari = Gaseste_recomandari_ContentBased(id_user, k/2, istoric_comenzi); List<Preparat> recomandari_collective = Gaseste_recomandari_Collective(id_user, comanda_actuala, k); foreach (var preparat in recomandari_collective) { if (recomandari.Count == k) { break; } if (!recomandari.Contains(preparat)) { recomandari.Add(preparat); } } } else { List<String> lista_specifice = DatabaseFunctions.getSpecificsForUser(id_user); if (lista_specifice == null) recomandari = DatabaseFunctions.topKPreparate(k); else recomandari = DatabaseFunctions.topKPreparateSpecific(lista_specifice, k); } return recomandari; }
// Recomandari calculate prin Collective Filtering. private static List<Preparat> Gaseste_recomandari_Collective(int id_user, Comanda comanda, int k) { // Gasim cei mai similari k vecini pentru userul cu id-ul user_id. int[] lista_vecini ; if (DatabaseFunctions.numarUtilizatori() < 1000) { lista_vecini = Calculeaza_vecini(3, id_user); } else { lista_vecini = Calculeaza_vecini_LSH(3, id_user); } List<IstoricComenzi> lista_istorice = DatabaseFunctions.istoricUtilizatori(lista_vecini); IstoricComenzi istoric_user = DatabaseFunctions.getIstoric(id_user); // Eliminare preparate comandate. // Eliminare cele a caror ora nu apartine intervalului curent. comanda = (comanda == null)? new Comanda(): comanda; List<Preparat> preparate = eliminaComandate(lista_istorice, istoric_user, comanda); List<Preparat> recomandari = preparate.GetRange(0,k) as List<Preparat>; return recomandari; }
private static List<Preparat> eliminaComandate(List<IstoricComenzi> istorice, IstoricComenzi istoric_user, Comanda comanda) { HashSet<Preparat> preparate = new HashSet<Preparat>(); int avg = DatabaseFunctions.numarMediuComandariPreparat(istoric_user.IdUser); foreach (var istoric in istorice) { foreach (var com in istoric.ListaComenzi) { foreach (DictionaryEntry item in com.ListaItem) { ItemComanda item_comanda = item.Value as ItemComanda; int nr = DatabaseFunctions.numarComandariPreparat(istoric_user.IdUser, item_comanda.Preparat.Id); if (!comanda.ListaItem.ContainsKey(item_comanda.Preparat.Id) && avg >= nr) { preparate.Add(item_comanda.Preparat); } } } } return preparate.ToList(); }