Пример #1
0
 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;
 }
Пример #2
0
        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();
            }
        }