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()); }
/// <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); }