public async Task GenerateSchedule() { var periodTimeslots = (await PeriodTimeslotRepository.GetEntityListAsync()) .Select(x => PeriodTimeslotConverter.Convert(x)).ToList(); var classrooms = (await ClassroomRepository.GetEntityListAsync()) .Select(x => ClassroomConverter.Convert(x)).ToList(); var teachingUnits = (await TeachingUnitRepository.GetEntityListAsync()) .Select(x => TeachingUnitConverter.Convert(x)).ToList(); var generation = new GeneticScheduleGeneration(10, teachingUnits.Count); generation.GlobalGA.IterationCompleted += async() => { var bestChromosome = generation.GlobalGA.ChromosomePool.First(); await HubContext.Clients.All.SendAsync("SendScheduleInfo", new ScheduleInfo() { MaxValue = bestChromosome.Value, AverageValue = generation.GlobalGA.Pool.Average(x => x.Value), AverageAge = generation.GlobalGA.Pool.Average(x => x.Age), Evaluations = { Function1.Count(bestChromosome.Schedule), Function3.Count(bestChromosome.Schedule), Function4.Count(bestChromosome.Schedule), Function5.Count(bestChromosome.Schedule), Function6.Count(bestChromosome.Schedule), Function7.Count(bestChromosome.Schedule) } }); }; var schedules = generation.Run(classrooms, periodTimeslots, teachingUnits); await ScheduleCellRepository.Clear(); await ScheduleCellRepository.AddRangeAsync(schedules.First().ScheduleCells.Select(x => ScheduleCellConverter.Convert(x))); var gridResponse = await GetScheduleGridPrivate(); await HubContext.Clients.All.SendAsync("GenerateScheduleCompleted", gridResponse); }
static async Task Main(string[] args) { var connectionOptions = new ConnectionOptions(ConnectionString); var periodTimeslotRepository = new MsSqlPeriodTimeslotRepository(connectionOptions); var classroomRepository = new MsSqlClassroomRepository(connectionOptions); var teachingUnitRepository = new MsSqlTeachingUnitRepository(connectionOptions); var scheduleCellRepository = new MsSqlScheduleCellRepository(connectionOptions); var periodTimeslots = (await periodTimeslotRepository.GetEntityListAsync()) .Select(x => PeriodTimeslotConverter.Convert(x)).ToList(); var classrooms = (await classroomRepository.GetEntityListAsync()) .Select(x => ClassroomConverter.Convert(x)).ToList(); var teachingUnits = (await teachingUnitRepository.GetEntityListAsync()) .Select(x => TeachingUnitConverter.Convert(x)).ToList(); var generation = new GeneticScheduleGeneration(10, teachingUnits.Count); var schedules = generation.Run(classrooms, periodTimeslots, teachingUnits); var i = 1; var sum = 0; var sum2 = 0; var sum3 = 0; var sum4 = 0; var sum5 = 0; var sum6 = 0; schedules.ForEach(x => { var f = Function1.Count(x); var f2 = Function3.Count(x); var f3 = Function4.Count(x); var f4 = Function5.Count(x); var f5 = Function6.Count(x); var f6 = Function7.Count(x); sum += f; sum2 += f2; sum3 += f3; sum4 += f4; sum5 += f5; sum6 += f6; Console.WriteLine($"Расписание {i++}"); Console.WriteLine($"Количество неутренних лекций: {f}"); Console.WriteLine($"Количество избыточных мест: {f2}"); Console.WriteLine($"Количество превышений пар в день для преподавателей: {f3}"); Console.WriteLine($"Количество окон для преподавателей: {f4}"); Console.WriteLine($"Количество превышений пар в день для студентов: {f5}"); Console.WriteLine($"Количество окон для студентов: {f6}"); Console.WriteLine($"Оценка расписания: {EvaluationCalculation.Calculate(x)}"); Console.WriteLine($"-------------------------------------"); }); Console.WriteLine($"Всего ошибок (Лекции): {sum}"); Console.WriteLine($"Всего ошибок (Избыточные места): {sum2}"); Console.WriteLine($"Всего ошибок (Количество превышений пар в день для преподавателей): {sum3}"); Console.WriteLine($"Всего ошибок (Количество окон для преподавателей): {sum4}"); Console.WriteLine($"Всего ошибок (Количество превышений пар в день для студентов): {sum5}"); Console.WriteLine($"Всего ошибок (Количество окон для студентов): {sum6}"); await scheduleCellRepository.Clear(); await scheduleCellRepository.AddRangeAsync(schedules.First().ScheduleCells.Select(x => ScheduleCellConverter.Convert(x))); Console.ReadKey(); }