예제 #1
0
        public async Task <List <EducationLine> > Calculate(Entrant entrant, IEnumerable <EducationLine> educationLines)
        {
            //Вычисляем характеристики пользователя
            var userCharacterisics = await _entrantCharacterizer.Calculate(entrant);

            //Вычисляем характеристики учебных направлений
            var educationLineRequrements = new List <EducationLineWithCharacterisics>();

            foreach (var item in educationLines.Where(item => item.EducationLinesRequirements.Count > 0))
            {
                var characteristics = await _educationLineCharacterizer.Calculate(item);

                var educationLineWithCharacteristics = new EducationLineWithCharacterisics(item, characteristics);
                educationLineRequrements.Add(educationLineWithCharacteristics);
            }

            //Получаем предпочтения пользователя
            var userPref = _preferenceRelationCalculator.GetPreferenceRelations(userCharacterisics);
            //Пересчитываем кластеры университетов с учетом предпочтений пользователя
            var recalculatedCharacterisics = RecalculateEducationLineCharacterisics(educationLineRequrements, userPref);
            //Строим множество паррето-оптимальных веткоров
            var parretoEducationLineCharacterisics = ParretoSetCreate(recalculatedCharacterisics);

            return(parretoEducationLineCharacterisics.Select(item => item.EducationLine).ToList());
        }
예제 #2
0
        /// <summary>
        ///     Перестраивает текущую "таблицу" учебноеНаправление/кластер c учетом предпочтений пользователя
        /// </summary>
        /// <param name="educationLineWithCharacterisics"></param>
        /// <param name="userPrefer">Отношения предпочтения пользователя</param>
        /// <returns>Перестроенная "таблица" учебноеНаправлени/кластер</returns>
        private List <EducationLineWithCharacterisics> RecalculateEducationLineCharacterisics(
            List <EducationLineWithCharacterisics> educationLineWithCharacterisics, List <PreferenceRelation> userPrefer)
        {
            var recalculateEducationLineCharacterisics = new List <EducationLineWithCharacterisics>();

            foreach (var item in educationLineWithCharacterisics)
            {
                //Разбиваем все кластеры текущего направления на важные и неважные
                var importantCharacterisics = new EducationLineWithCharacterisics(item.EducationLine,
                                                                                  new Dictionary <string, double>());
                var unImportantCharacterisics = new EducationLineWithCharacterisics(item.EducationLine,
                                                                                    new Dictionary <string, double>());
                foreach (var characterisics in item.Characterisics)
                {
                    if (userPrefer.Any(p => p.ImportantCharacterisicName == characterisics.Key))
                    {
                        importantCharacterisics.Characterisics.Add(characterisics.Key, characterisics.Value);
                    }
                    else
                    {
                        unImportantCharacterisics.Characterisics.Add(characterisics.Key, characterisics.Value);
                    }
                }

                //Пересчитываем значения неважных кластеров
                var recalculatedCharacterisics = new EducationLineWithCharacterisics(item.EducationLine,
                                                                                     new Dictionary <string, double>());
                var i = 0; //используется для поментки пересозданных кластеров
                foreach (var importantCharacterisic in importantCharacterisics.Characterisics)
                {
                    i++;
                    //Добавляем текущий значимый
                    recalculatedCharacterisics.Characterisics.Add(importantCharacterisic.Key,
                                                                  importantCharacterisic.Value);
                    //Добавляем пересчитанные неважные
                    foreach (var unImportantCharacterisic in unImportantCharacterisics.Characterisics)
                    {
                        //формула пересчета
                        var fI = importantCharacterisic.Value;
                        var fJ = unImportantCharacterisic.Value;

                        var preference =
                            userPrefer.Single(p => p.ImportantCharacterisicName == importantCharacterisic.Key);
                        //находим значимый кластер в списке с предпочтениями
                        var teta = preference.Tetas.Single(p => p.Key == unImportantCharacterisic.Key).Value;
                        //находим в этом кластере текущее отношение предпочтения

                        var recalculatedCharacterisic = teta * fI + (1 - teta) * fJ;

                        recalculatedCharacterisics.Characterisics.Add(unImportantCharacterisic.Key + "(" + i + ")",
                                                                      recalculatedCharacterisic); //добавляем пересчитанный
                    }
                }

                recalculateEducationLineCharacterisics.Add(recalculatedCharacterisics);
            }
            return(recalculateEducationLineCharacterisics);
        }