public OptimizerEngineBuilder(DatabaseContext _context, DateTime start, DateTime end, Priority priority, bool debug = false) { ShowDebugMessages = debug; StartDate = start; EndDate = end; Engine = new OptimizerEngine(); Engine.MyPriority = priority; context = _context; }
public void Run(TimeSpan timeLimit) { MyEngine = MyBuilder.Build(timeLimit); watch = System.Diagnostics.Stopwatch.StartNew(); Console.WriteLine("Optimizing..."); Thread thread = new Thread(() => Optimize()); thread.Start(); ThreadInProgress = true; counter = 1; MyEngine.watch = System.Diagnostics.Stopwatch.StartNew(); while (ThreadInProgress) { if (MyEngine.MyPriority != Priority.FirstAvailable) { var status = MyEngine.GetStatus(counter++.ToString(), watch.Elapsed); Console.WriteLine(status); System.Threading.Thread.Sleep(4000); } } thread.Join(); // Add the results to the table foreach (var result in MyResults.Results) { result.CreationTimestamp = DateTime.Today; context.Entry(result).State = result.ID == 0 ? EntityState.Added : EntityState.Modified; } foreach (var input in MyResults.Inputs) { context.Entry(input).State = input.Id == 0 ? EntityState.Added : EntityState.Modified; } //context.SaveChanges(); if (ShowDebugMessages) { watch.Stop(); Console.WriteLine("\nOptimization Complete.\n"); if (MyEngine.MyPriority != Priority.FirstAvailable) { Console.WriteLine(MyEngine.GetStatus("Final", watch.Elapsed) + "\n"); } Console.WriteLine("\nOriginal Optimizer Inputs"); ConsoleTable.From <OptimizerInputPrintable>(MyEngine.Inputs.Select(x => new OptimizerInputPrintable(x))).Write(Format.MarkDown); Console.WriteLine(""); Console.WriteLine("Preexisting Schedule"); try { ConsoleTable.From <ScheduledClassPrintable>(MyEngine.CurrentSchedule.Select(c => new ScheduledClassPrintable(c))).Write(Format.MarkDown); } catch { } switch (MyEngine.MyPriority) { case Priority.Default: Console.WriteLine($"Total classes scheduled: {MyResults.Results.Count} out of {MyBuilder.OriginalInputCount}.\n"); break; case Priority.FirstAvailable: break; case Priority.MaximizeInstructorLongestToTeach: Console.WriteLine($"The total time between all instructor assignments and the last time they taught the course is {MyEngine.CurrentBestAnswer.OptimizationScore} days.\n"); break; case Priority.MaximizeSpecializedInstructors: Console.WriteLine($"Between all assigned instructors for this answer, they have a total of {MyResults.OptimizationScore} qualifications.\n"); break; case Priority.MinimizeForeignInstructorCount: Console.WriteLine($"{MyResults.OptimizationScore} instructors will have to travel to fulfill these assignments.\n"); break; case Priority.MinimizeInstructorTravelDistance: Console.WriteLine($"Instructors will have to travel a total of {MyResults.OptimizationScore} miles to fulfill these assignments.\n"); break; } MyResults.Print(); } }