예제 #1
0
        public override Schedule CreateScheduleFromEncoding(IScheduleEncoding encoding)
        {
            var solution = encoding as PRVEncoding;

            if (solution == null)
            {
                throw new InvalidOperationException("Encoding is not of type PWREncoding");
            }

            var jobs = (ItemList <Job>)JobDataParameter.ActualValue.Clone();
            var resultingSchedule = new Schedule(jobs[0].Tasks.Count);

            //Reset scheduled tasks in result
            foreach (Job j in jobs)
            {
                foreach (Task t in j.Tasks)
                {
                    t.IsScheduled = false;
                }
            }

            //GT-Algorithm
            //STEP 0 - Compute a list of "earliest operations"
            ItemList <Task> earliestTasksList = GTAlgorithmUtils.GetEarliestNotScheduledTasks(jobs);

            //int currentDecisionIndex = 0;
            while (earliestTasksList.Count > 0)
            {
                //STEP 1 - Get earliest not scheduled operation with minimal earliest completing time
                Task minimal = GTAlgorithmUtils.GetTaskWithMinimalEC(earliestTasksList, resultingSchedule);

                //STEP 2 - Compute a conflict set of all operations that can be scheduled on the machine the previously selected operation runs on
                ItemList <Task> conflictSet = GTAlgorithmUtils.GetConflictSetForTask(minimal, earliestTasksList, jobs, resultingSchedule);

                //STEP 3 - Select an operation from the conflict set (various methods depending on how the algorithm should work..)
                //Task selectedTask = SelectTaskFromConflictSet(conflictSet, solution.PriorityRulesVector [currentDecisionIndex++], solution.NrOfRules.Value);
                Task selectedTask = SelectTaskFromConflictSet(conflictSet, solution.PriorityRulesVector[minimal.JobNr], solution.NrOfRules.Value, resultingSchedule, jobs);

                //STEP 4 - Adding the selected operation to the current schedule
                selectedTask.IsScheduled = true;
                double startTime = GTAlgorithmUtils.ComputeEarliestStartTime(selectedTask, resultingSchedule);
                resultingSchedule.ScheduleTask(selectedTask.ResourceNr, startTime, selectedTask.Duration, selectedTask.JobNr);

                //STEP 5 - Back to STEP 1
                earliestTasksList = GTAlgorithmUtils.GetEarliestNotScheduledTasks(jobs);
            }

            return(resultingSchedule);
        }
예제 #2
0
        public Schedule CreateScheduleFromEncoding(JSMEncoding solution, ItemList <Job> jobData)
        {
            ItemList <Permutation> jobSequenceMatrix = solution.JobSequenceMatrix;

            var jobs = (ItemList <Job>)jobData.Clone();
            var resultingSchedule = new Schedule(jobs[0].Tasks.Count);

            //Reset scheduled tasks in result
            foreach (Job j in jobs)
            {
                foreach (Task t in j.Tasks)
                {
                    t.IsScheduled = false;
                }
            }

            //GT-Algorithm
            //STEP 0 - Compute a list of "earliest operations"
            ItemList <Task> earliestTasksList = GTAlgorithmUtils.GetEarliestNotScheduledTasks(jobs);

            while (earliestTasksList.Count > 0)
            {
                //STEP 1 - Get earliest not scheduled operation with minimal earliest completing time
                Task     minimal = GTAlgorithmUtils.GetTaskWithMinimalEC(earliestTasksList, resultingSchedule);
                int      conflictedResourceNr = minimal.ResourceNr;
                Resource conflictedResource   = resultingSchedule.Resources[conflictedResourceNr];

                //STEP 2 - Compute a conflict set of all operations that can be scheduled on the conflicted resource
                ItemList <Task> conflictSet = GTAlgorithmUtils.GetConflictSetForTask(minimal, earliestTasksList, jobs, resultingSchedule);

                //STEP 3 - Select a task from the conflict set
                int  progressOnResource = conflictedResource.Tasks.Count;
                Task selectedTask       = SelectTaskFromConflictSet(conflictedResourceNr, progressOnResource, conflictSet, jobSequenceMatrix);

                //STEP 4 - Add the selected task to the current schedule
                selectedTask.IsScheduled = true;
                double startTime = GTAlgorithmUtils.ComputeEarliestStartTime(selectedTask, resultingSchedule);
                resultingSchedule.ScheduleTask(selectedTask.ResourceNr, startTime, selectedTask.Duration, selectedTask.JobNr);

                //STEP 5 - Back to STEP 1
                earliestTasksList = GTAlgorithmUtils.GetEarliestNotScheduledTasks(jobs);
            }

            return(resultingSchedule);
        }