/// <summary> /// Copy constructor /// </summary> /// <param name="Original"></param> public Schedule(Schedule Original) { //Point to same thing as original Problem = Original.Problem; PrecedenceDAG = Original.PrecedenceDAG; RMs = Original.RMs; //Create new Machines = new List <Machine>(Problem.NMachines); for (int i = 0; i < Problem.NMachines; i++) { Machines.Add(new Machine(i + 1, PrecedenceDAG.N)); } Starttimes = new double[PrecedenceDAG.N]; for (int i = 0; i < Starttimes.Length; i++) { Starttimes[i] = -1; } AssignedMachineID = new int[PrecedenceDAG.N]; for (int i = 0; i < PrecedenceDAG.N; i++) { AssignedMachineID[i] = -1; } LSS = new double[PrecedenceDAG.N]; ESS = new double[PrecedenceDAG.N]; //MachineArcPointers = new MachineArcPointer[PrecedenceDAG.N]; //Copy the information: Original.ForeachJobInPrecOrderDo(j => AssignJobToMachineById(j.ID, Original.AssignedMachineID[j.ID])); this.AssignmentDescription = Original.AssignmentDescription; this.StartTimeDescription = Original.StartTimeDescription; CalcESS(); CalcLSS(); SetESS(); for (int i = 0; i < PrecedenceDAG.N; i++) { if (GetIndexOnMachine(PrecedenceDAG.GetJobById(i)) != Original.GetIndexOnMachine(PrecedenceDAG.GetJobById(i))) { throw new Exception("Copy mistake"); } if (AssignedMachine(PrecedenceDAG.GetJobById(i)).MachineID != Original.AssignedMachine(PrecedenceDAG.GetJobById(i)).MachineID) { Console.WriteLine("ERROR. Copy mistake with job at index {0}. Testing ForEachJobInPrecOrderDo.. found jobs:", i); Original.ForeachJobInPrecOrderDo(j => Console.WriteLine(j.ID)); Original.Print(); this.Print(); Console.WriteLine("AssignedMachineID {0} neq to Original AssignedMachineID {1}", AssignedMachine(PrecedenceDAG.GetJobById(i)).MachineID, Original.AssignedMachine(PrecedenceDAG.GetJobById(i)).MachineID); throw new Exception("Copy mistake"); } } }
/// <summary> /// Calculate ESS than Cmax based on that. /// </summary> /// <returns></returns> public double EstimateCmax() { //placeholder; CalcESS(); double Maximum = 0; int MaxID = 0; for (int i = 1; i < Starttimes.Length; i++) { if (GetEarliestStart(PrecedenceDAG.GetJobById(i)) < 0) { throw new Exception("Startimes not calculated yet"); } if (GetEarliestStart(PrecedenceDAG.GetJobById(i)) + PrecedenceDAG.GetJobById(i).MeanProcessingTime > Maximum) { Maximum = GetEarliestStart(PrecedenceDAG.GetJobById(i)) + PrecedenceDAG.GetJobById(i).MeanProcessingTime; MaxID = i; } } DeterministicCmax = Maximum; // Console.WriteLine("Debug: Cmax is estimated to be {0}", EstimatedCmax); return(DeterministicCmax); }