public static void CalculatePenaltyAndMissingTotalMinutes()
        {
            var bag  = new ConcurrentBag <(int, int, int)>();
            var bag2 = new ConcurrentBag <int>();

            Parallel.For(1, 25, i =>
            {
                var result     = RunSchedulerAlgorithm(i, copyToClipboard: false);
                var penalty    = OptimalityEvaluator.CalculatePenalty(result.Result);
                var aggregates = EvaluationDataAggregator.GetAggregate(result.Result).ToDictionary(a => a.EmployeeId);

                var sumOfUnderMin = result.Result.Employees
                                    .Where(e => aggregates[e.Id].TotalWorkedMinutes < e.Contract.MinTotalWorkTime)
                                    .Sum(e => e.Contract.MinTotalWorkTime - aggregates[e.Id].TotalWorkedMinutes);

                bag.Add((i, penalty, sumOfUnderMin));

                var sumOfUnderMin2 = result.Result.Employees
                                     .Where(e => aggregates[e.Id].TotalWorkedMinutes < e.Contract.MinTotalWorkTime)
                                     .Select(e => e.Contract.MinTotalWorkTime - aggregates[e.Id].TotalWorkedMinutes);

                foreach (var item in sumOfUnderMin2)
                {
                    bag2.Add(item);
                }
            });

            var str  = string.Join(Environment.NewLine, bag.OrderBy(x => x.Item1).Select(x => $"{x.Item1}\t{x.Item2}\t{x.Item3}"));
            var str2 = string.Join(Environment.NewLine, bag2);
        }
        private static AlgorithmResult RunSchedulerAlgorithm(int?instanceNumber = null, bool copyToClipboard = true)
        {
            var dto = SchedulingBenchmarkInstanceReader.FromXml(instanceNumber ?? InstanceNumber);
            var schedulingBenchmarkModel = DtoToSchedulingBenchmarkModelMapper.MapToSchedulingBenchmarkModel(dto);
            var sw = new Stopwatch();

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();

            sw.Start();
            var result = SchedulerAlgorithmRunner.Run(schedulingBenchmarkModel);

            sw.Stop();

            if (copyToClipboard)
            {
                Clipboard.Copy(result.ToRosterViewerFormat());
            }

            var(feasible, messages) = FeasibilityEvaluator.Evaluate(result);

            messages.Sort();

            return(new AlgorithmResult
            {
                Name = "Scheduler Algorithm Solution",
                Result = result,
                Penalty = OptimalityEvaluator.CalculatePenalty(result),
                Feasible = feasible,
                FeasibilityMessages = messages,
                Duration = sw.Elapsed
            });
        }
        public ExpectedTestResult GenerateResult()
        {
            var result = new ExpectedTestResult
            {
                ExpectedPenalty = OptimalityEvaluator.CalculatePenalty(_result),
                ExpectedMaxNumberOfShiftsFeasibility     = ForEachEmployee(_feasibilityEvaluator.MaxNumberOfShiftsNotExceeded),
                ExpectedMinTotalMinsFeasibility          = ForEachEmployee(_feasibilityEvaluator.MinTotalMinutesNotExceeded),
                ExpectedMaxTotalMinsFeasibility          = ForEachEmployee(_feasibilityEvaluator.MaxTotalMinutesNotExceeded),
                ExpectedMinConsecutiveShiftsFeasibility  = ForEachEmployee(_feasibilityEvaluator.MinConsecutiveShiftsNotExceeded),
                ExpectedMaxConsecutiveShiftsFeasibility  = ForEachEmployee(_feasibilityEvaluator.MaxConsecutiveShiftsNotExceeded),
                ExpectedMinConsecutiveDaysOffFeasibility = ForEachEmployee(_feasibilityEvaluator.MinConsecutiveDaysOffNotExceeded),
                ExpectedMaxNumberOfWeekendsFeasibility   = ForEachEmployee(_feasibilityEvaluator.MaxNumberOfWeekendsNotExceeded),
                ExpectedDayOffsFeasibility     = ForEachEmployee(_feasibilityEvaluator.DayOffsRespected),
                ExpectedMinRestTimeFeasibility = ForEachEmployee(_feasibilityEvaluator.MinRestTimeRespected)
            };

            result.ExpectedFeasibility = Feasible(result);

            return(result);
        }
Example #4
0
        public void AssertOptimality()
        {
            var actualPenalty = OptimalityEvaluator.CalculatePenalty(_result);

            Assert.Equal(_expectedTestResult.ExpectedPenalty, actualPenalty);
        }