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); }
public void AssertOptimality() { var actualPenalty = OptimalityEvaluator.CalculatePenalty(_result); Assert.Equal(_expectedTestResult.ExpectedPenalty, actualPenalty); }