示例#1
0
        public async Task <bool> UpdateSimilarityScores(Guid userId)
        {
            var oldScores = await _context.SimilarityScores.Where(x => x.FromUserId == userId).ToListAsync();

            var features = (await _featureApplication.GetFeatures()).Where(x => x.IsCalculated).ToList();
            var columns  = features.Count;

            var users = await GetUsersToCalculate(userId);

            int rows = users.Count;

            double[,] usersMatrix = new double[rows, columns];
            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < columns; j++)
                {
                    var vm = users[i].FeatureViewModels
                             .Where(x => x.FeatureId == features[j].Id)
                             .FirstOrDefault();

                    if (vm == null)
                    {
                        usersMatrix[i, j] = -1;
                    }
                    else
                    {
                        if (!vm.IsCalculated)
                        {
                            usersMatrix[i, j] = 0;
                            continue;
                        }
                        usersMatrix[i, j] = vm.Rate * vm.weight;
                    }
                }
            }

            SimilarityMatrix m = new SimilarityMatrix
            {
                Row    = rows,
                Column = columns,
                Matrix = usersMatrix
            };

            List <double> kq = new List <double>();

            kq = m.SimilarityCalculate();

            users.RemoveAt(0);

            var similarityScores = new List <SimilarityScore>();

            for (int i = 1; i < kq.Count; i++)
            {
                users[i - 1].Point = kq[i];
                var score = new SimilarityScore()
                {
                    FromUserId = userId,
                    ToUserId   = users[i - 1].UserId,
                    Score      = kq[i]
                };
                similarityScores.Add(score);
            }
            try
            {
                _context.SimilarityScores.AddRange(similarityScores);
                _context.SimilarityScores.RemoveRange(oldScores);
                await _context.SaveChangesAsync();

                return(true);
            }
            catch
            {
                return(false);
            }
        }
示例#2
0
        public async Task <bool> UpdateSimilarityScores(Guid userId)
        {
            var user = await GetById(userId);

            var oldScores = await _context.SimilarityScores.Where(x => x.FromUserId == userId).ToListAsync();

            var tempUsers = new List <AppUser>();
            var users     = await GetActiveUsers(userId, true);

            users.Remove(users.Where(x => x.Id == userId).FirstOrDefault());
            //var users = await _context.Users.Where(x => x.Status == EUserStatus.Active && x.IsInfoUpdated && x.Id != userId).ToListAsync();

            //
            tempUsers = users
                        .Where(x => x.Id != userId && x.Gender == user.FindPeople)
                        .ToList();
            users = new List <AppUser>();
            var userAgeGroup = GetAgeGroup(user.Dob);
            int userAgeValue = Convert.ToInt32(userAgeGroup);

            foreach (var item in tempUsers)
            {
                var ageGroup = GetAgeGroup(item.Dob);
                int ageValue = Convert.ToInt32(ageGroup);

                if (Math.Abs(userAgeValue - ageValue) <= 1)
                {
                    users.Add(item);
                }
            }

            //
            users.Insert(0, user);
            int sl = users.Count;

            double[,] usersMatrix = new double[sl, 19];
            for (int i = 0; i < sl; i++)
            {
                usersMatrix[i, 0]  = (double)users[i].Marriage;
                usersMatrix[i, 1]  = (double)users[i].Target;
                usersMatrix[i, 2]  = (double)users[i].Education;
                usersMatrix[i, 3]  = (double)users[i].Body;
                usersMatrix[i, 4]  = (double)users[i].Religion;
                usersMatrix[i, 5]  = (double)users[i].Smoking;
                usersMatrix[i, 6]  = (double)users[i].DrinkBeer;
                usersMatrix[i, 7]  = (double)users[i].Cook;
                usersMatrix[i, 8]  = (double)users[i].Game;
                usersMatrix[i, 9]  = (double)users[i].Travel;
                usersMatrix[i, 10] = (double)users[i].LikePet;
                usersMatrix[i, 11] = (double)users[i].LikeTechnology;
                usersMatrix[i, 12] = (double)users[i].Shopping;
                usersMatrix[i, 13] = (double)users[i].PlaySport;
                usersMatrix[i, 14] = (double)users[i].FavoriteMovie;
                usersMatrix[i, 15] = (double)users[i].AtmosphereLike;
                usersMatrix[i, 16] = (double)users[i].Character;
                usersMatrix[i, 17] = (double)users[i].LifeStyle;
                usersMatrix[i, 18] = (double)users[i].MostValuable;
            }

            SimilarityMatrix m = new SimilarityMatrix();

            m.Row    = sl;
            m.Column = 19;
            m.Matrix = usersMatrix;

            List <double> kq = new List <double>();

            kq = m.SimilarityCalculate();

            users.RemoveAt(0);

            var similarityScores = new List <SimilarityScore>();

            for (int i = 1; i < kq.Count; i++)
            {
                users[i - 1].Point = kq[i];
                var score = new SimilarityScore()
                {
                    FromUserId = userId,
                    ToUserId   = users[i - 1].Id,
                    Score      = kq[i]
                };
                similarityScores.Add(score);
            }
            try
            {
                _context.SimilarityScores.AddRange(similarityScores);
                _context.SimilarityScores.RemoveRange(oldScores);
                await _context.SaveChangesAsync();

                return(true);
            }
            catch
            {
                return(false);
            }
        }