public ResultAssociation Schedule(ModelAssociation currentModelAssoscation, MachineEnvironment currentMachineEnvironment, List <Constraint> currentConstraints, OptimisationObjective currentOptimisationObjective, DateTime startingWholeProcessingDate) { // Sort all operations on nearest Due Date first List <Operation> AllOperations = SchedulingUtlis.GetAllOperations(currentModelAssoscation.AllBatches); AllOperations.Sort((operation1, operation2) => operation1.CurrentBatch.DueDate.CompareTo(operation2.CurrentBatch.DueDate)); List <OperationMachineAssignment> CurrentOperationMachineAssociations = new List <OperationMachineAssignment>(); foreach (Operation CurrentOperation in AllOperations) { // Find next available machine for the processing of current operation List <Machine> CapableMachines = CurrentOperation.CapableMachinesWithProcessingTime.Keys.ToList(); CapableMachines.Sort((machine1, machine2) => machine1.NextAvailableStartProcessingDate.CompareTo(machine2.NextAvailableStartProcessingDate)); Machine ChosenMachine = CapableMachines.First(); DateTime StartProcessingDate = ChosenMachine.NextAvailableStartProcessingDate; // if it isn't the first process on the machine in the scheduling => we have to include setup time if (!startingWholeProcessingDate.Equals(StartProcessingDate)) { SetupForBatch CurrentSetupForBatch = CurrentOperation.SetupTimes .Find(setup => setup.CurrentMachine.Equals(ChosenMachine) && setup.PreviousOperation.Index.Equals(ChosenMachine.CurrentlyProcessedOperation.Index)); StartProcessingDate = StartProcessingDate.AddSeconds(CurrentSetupForBatch.SetupTime); } // Calculate processing time int NeededProcessingTime = CurrentOperation.CapableMachinesWithProcessingTime[ChosenMachine] * CurrentOperation.CurrentBatch.NumberOfJobs; // Include maintenance DateTime FinishProcessingDate = StartProcessingDate; while (NeededProcessingTime > ChosenMachine.TimeLeftTillMaintenance) { // Operation before maintenance FinishProcessingDate = FinishProcessingDate.AddSeconds(ChosenMachine.TimeLeftTillMaintenance); CurrentOperationMachineAssociations.Add (new OperationMachineAssignment(CurrentOperation, ChosenMachine, StartProcessingDate, FinishProcessingDate)); NeededProcessingTime -= ChosenMachine.TimeLeftTillMaintenance; StartProcessingDate = FinishProcessingDate; // Maintenance FinishProcessingDate = StartProcessingDate.AddSeconds(ChosenMachine.TimeOfMaintenance); CurrentOperationMachineAssociations.Add (new OperationMachineAssignment(OperationFactory.generateMaintenance(), ChosenMachine, StartProcessingDate, FinishProcessingDate)); ChosenMachine.TimeLeftTillMaintenance = RandomGenerator.MachineTimeLeftTillMaintenanceForSmallScaleProduction(); StartProcessingDate = FinishProcessingDate; } // Operation FinishProcessingDate = FinishProcessingDate.AddSeconds(NeededProcessingTime); CurrentOperationMachineAssociations.Add(new OperationMachineAssignment(CurrentOperation, ChosenMachine, StartProcessingDate, FinishProcessingDate)); ChosenMachine.TimeLeftTillMaintenance -= NeededProcessingTime; // Update dates for the machine ChosenMachine.NextAvailableStartProcessingDate = FinishProcessingDate; ChosenMachine.CurrentlyProcessedOperation = CurrentOperation; } return(new ResultAssociation(CurrentOperationMachineAssociations, null, null)); }
public ResultAssociation Schedule(ModelAssociation CurrentModel, MachineEnvironment CurrentMachineEnvironment, List <Constraint> CurrentConstraints, OptimisationObjective CurrentOptimisationObjective, DateTime startingWholeProcessingDate) { throw new NotImplementedException(); }
public ResultAssociation Schedule(ModelAssociation currentModelAssoscation, MachineEnvironment currentMachineEnvironment, List <Constraint> currentConstraints, OptimisationObjective currentOptimisationObjective, DateTime startingWholeProcessingDate) { // Sort all batches on nearest Due Date first List <Batch> AllBatches = currentModelAssoscation.AllBatches; AllBatches.Sort((batch1, batch2) => batch1.DueDate.CompareTo(batch2.DueDate)); List <OperationMachineAssignment> CurrentOperationMachineAssociations = new List <OperationMachineAssignment>(); foreach (Batch CurrentBatch in AllBatches) { List <Operation> CurrentOperations = CurrentBatch.JobInBatch.ListOfOperations; foreach (Operation CurrentOperation in CurrentOperations) { // First operation in Job will start immidiatelly if (CurrentOperation.ReleaseDate.Equals(DateTime.MaxValue)) { CurrentOperation.ReleaseDate = startingWholeProcessingDate; } // Find next available machine for the processing of current operation List <Machine> CapableMachines = CurrentOperation.CapableMachinesWithProcessingTime.Keys.ToList(); CapableMachines.Sort((machine1, machine2) => machine1.NextAvailableStartProcessingDate.CompareTo(machine2.NextAvailableStartProcessingDate)); Machine ChosenMachine = CapableMachines.First(); DateTime StartProcessingDate = CurrentOperation.ReleaseDate; // if it isn't the first process on the machine in the scheduling => we have to include setup time SetupForBatch CurrentSetupForBatch = CurrentOperation.SetupTimes .Find(setup => setup.CurrentMachine.Equals(ChosenMachine) && ChosenMachine.CurrentlyProcessedOperation != null && setup.PreviousOperation.Index.Equals(ChosenMachine.CurrentlyProcessedOperation.Index)); // If the machine wasn't able to be setup after previous job -> add setup time if (CurrentSetupForBatch != null && StartProcessingDate.CompareTo(ChosenMachine.NextAvailableStartProcessingDate.AddSeconds(CurrentSetupForBatch.SetupTime)) < 0) { StartProcessingDate = ChosenMachine.NextAvailableStartProcessingDate.AddSeconds(CurrentSetupForBatch.SetupTime); } else { Console.WriteLine("Now " + ChosenMachine.Name + StartProcessingDate); } // Calculate processing time int NeededProcessingTime = CurrentOperation.CapableMachinesWithProcessingTime[ChosenMachine] * CurrentOperation.CurrentBatch.NumberOfJobs; // Include maintenance DateTime FinishProcessingDate = StartProcessingDate; while (NeededProcessingTime > ChosenMachine.TimeLeftTillMaintenance) { // Operation before maintenance FinishProcessingDate = FinishProcessingDate.AddSeconds(ChosenMachine.TimeLeftTillMaintenance); CurrentOperationMachineAssociations.Add (new OperationMachineAssignment(CurrentOperation, ChosenMachine, StartProcessingDate, FinishProcessingDate)); NeededProcessingTime -= ChosenMachine.TimeLeftTillMaintenance; StartProcessingDate = FinishProcessingDate; // Maintenance FinishProcessingDate = StartProcessingDate.AddSeconds(ChosenMachine.TimeOfMaintenance); CurrentOperationMachineAssociations.Add (new OperationMachineAssignment(OperationFactory.generateMaintenance(), ChosenMachine, StartProcessingDate, FinishProcessingDate)); ChosenMachine.ResetTimeLeftTillMaintenanceWithAgingEffect(); StartProcessingDate = FinishProcessingDate; } // Operation FinishProcessingDate = FinishProcessingDate.AddSeconds(NeededProcessingTime); CurrentOperationMachineAssociations.Add(new OperationMachineAssignment(CurrentOperation, ChosenMachine, StartProcessingDate, FinishProcessingDate)); ChosenMachine.TimeLeftTillMaintenance -= NeededProcessingTime; // Update dates for the machine ChosenMachine.NextAvailableStartProcessingDate = FinishProcessingDate; ChosenMachine.CurrentlyProcessedOperation = CurrentOperation; // Next operation can start after previous one in the same job if (CurrentOperation.CurrentJob.GetNextOperation(CurrentOperation) != null) { CurrentOperation.CurrentJob.GetNextOperation(CurrentOperation).ReleaseDate = FinishProcessingDate; } } } return(new ResultAssociation(CurrentOperationMachineAssociations, null, null)); }