public JobProcessorList(JobPriorityFunction priorityFunction) { _receivedJobs = new Dictionary<int, IJob>(); _processingJobs = new Dictionary<int, IJob>(); _processedJobs = new Dictionary<int, IJob>(); _jobsList = new FibonacciQueue<IJob, double>(priorityFunction.CalculatePriority); _distanceRelaxer = DistanceRelaxers.EdgeShortestDistance; }
private const int MaxIterationCount = 24*60*365*4; // 4 years of minutes protected IEnumerable<IScheduledJob> Solve( List<IShift> shifts, List<IWorker> workers, List<ITool> tools, IEnumerable<IZone> zones, IEnumerable<IJob> jobs, GreedyActivityStrategy strategy, ShiftManager shiftManager) { _shiftManager = shiftManager; _strategy = strategy; _jobPriorityFunction = new SlackTimeRemainingJobPriorityFunction(); if (shifts.Count > 0) { _shifts = shifts.ToArray(); SetupWorkers(shifts, workers); SetupTools(shifts, tools); } SetupZones(zones); SetupJobs(jobs); _timepoints = new Dictionary<int, List<InWorkEvent>>(); _inWorkEvents = new List<InWorkEvent>(); int iteration = InitializeNextIteration(_shifts[0]); while (_jobs.Any() && iteration < MaxIterationCount) { // check to see if we have any events expiring ProcessCompletingJobs(iteration); // check to see if we have any new jobs we can work on ProcessJobs(iteration); // increment iteration counter iteration++; } // we're done! return BuildSchedule(); }