- Timestamp:
- 01/22/18 17:15:29 (6 years ago)
- Location:
- branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/HeuristicLab.Problems.PFSP-3.3.csproj
r15541 r15639 88 88 </ItemGroup> 89 89 <ItemGroup> 90 <Compile Include="Evaluators\CmaxMakeSpanEvaluator.cs" />91 <Compile Include="Evaluators\MakeSpanEvaluator.cs" />92 <Compile Include="Evaluators\PFSPEvaluator.cs" />93 <Compile Include="Interfaces\IMakespanEvaluator.cs" />94 <Compile Include="JobMatrix.cs" />95 <Compile Include="Interfaces\IPFSPEvaluator.cs" />96 90 <Compile Include="PermutationFlowshopSchedulingProblem.cs" /> 97 91 <Compile Include="Plugin.cs" /> -
branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/PermutationFlowshopSchedulingProblem.cs
r15541 r15639 1 1 #region License Information 2 2 /* HeuristicLab 3 * Copyright (C) 2002-201 6Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 * 5 5 * This file is part of HeuristicLab. … … 21 21 22 22 using System; 23 using System.Drawing;24 23 using System.Linq; 25 24 using HeuristicLab.Common; … … 29 28 using HeuristicLab.Parameters; 30 29 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 31 using HeuristicLab.PluginInfrastructure;32 30 using HeuristicLab.Problems.Instances; 33 31 using HeuristicLab.Optimization; 34 using System.Collections.Generic;35 32 36 namespace HeuristicLab.Problems.PFSP 37 { 38 [Item("Permutation Flowshop Scheduling Problem (PFSP)", "Represents a Permutation Flowshop Scheduling Problem")] 39 [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 999)] 40 [StorableClass] 41 public sealed class PermutationFlowshopSchedulingProblem : SingleObjectiveHeuristicOptimizationProblem<IPFSPEvaluator, IPermutationCreator>, IProblemInstanceConsumer<FSSPData>, IProblemInstanceExporter<FSSPData>, IStorableContent 42 { 43 #region Default Instance 44 private static readonly FSSPData DefaultInstance = new FSSPData() 45 { 46 Name = "Permutation Flowshop Scheduling Problem (PFSP)", 47 Description = "The default instance of the PFSP problem in HeuristicLab", 48 Jobs = 4, 49 Machines = 4, 50 //BestKnownQuality = 328, 51 ProcessingTimes = new double[,] { 33 namespace HeuristicLab.Problems.PFSP { 34 [Item("Permutation Flowshop Scheduling Problem (PFSP)", "Represents a Permutation Flowshop Scheduling Problem")] 35 [Creatable(CreatableAttribute.Categories.CombinatorialProblems)] 36 [StorableClass] 37 public sealed class PermutationFlowshopSchedulingProblem : SingleObjectiveBasicProblem<PermutationEncoding>, IProblemInstanceConsumer<FSSPData>, IProblemInstanceExporter<FSSPData> { 38 #region Fields 39 private static readonly FSSPData DefaultInstance = new FSSPData() { 40 Name = "Permutation Flowshop Scheduling Problem (PFSP)", 41 Description = "The default instance of the PFSP problem in HeuristicLab", 42 Jobs = 4, 43 Machines = 4, 44 //BestKnownQuality = 328, 45 ProcessingTimes = new double[,] { 52 46 {5 ,3, 6 ,6 }, 53 47 {2 ,4, 8 ,4}, … … 55 49 {5 ,3, 8 ,6} 56 50 } 57 }; 58 #endregion 51 }; 52 public event EventHandler BestKnownSolutionChanged; 53 #endregion 59 54 60 public string Filename { get; set; } 55 #region Getter/Setter 56 public OptionalValueParameter<Permutation> BestKnownSolutionParameter 57 { 58 get { return (OptionalValueParameter<Permutation>)Parameters["BestKnownSolution"]; } 59 } 60 public OptionalValueParameter<DoubleMatrix> JobMatrixParameter 61 { 62 get { return (OptionalValueParameter<DoubleMatrix>)Parameters["JobMatrix"]; } 63 } 64 public Permutation BestKnownSolution 65 { 66 get { return BestKnownSolutionParameter.Value; } 67 set 68 { 69 BestKnownSolutionParameter.Value = value; 70 if (BestKnownSolutionChanged != null) { OnBestKnownSolutionChanged(); } 71 } 72 } 73 public DoubleMatrix JobMatrix 74 { 75 get { return JobMatrixParameter.Value; } 76 set { JobMatrixParameter.Value = value; } 77 } 61 78 62 #region Parameter Properties 63 public OptionalValueParameter<Permutation> BestKnownSolutionParameter 64 { 65 get { return (OptionalValueParameter<Permutation>)Parameters["BestKnownSolution"]; } 79 public override bool Maximization { get { return false; } } 80 #endregion 81 82 #region Ctor 83 [StorableConstructor] 84 private PermutationFlowshopSchedulingProblem(bool deserializing) : base(deserializing) { } 85 private PermutationFlowshopSchedulingProblem(PermutationFlowshopSchedulingProblem original, Cloner cloner) : base(original, cloner) { } 86 public PermutationFlowshopSchedulingProblem() { 87 Parameters.Add(new OptionalValueParameter<Permutation>("BestKnownSolution", "The best known solution of this FSSP instance.")); 88 Parameters.Add(new OptionalValueParameter<DoubleMatrix>("JobMatrix", "The matrix which contains the jobs,machines and duration.")); 89 90 Load(DefaultInstance); 91 EvaluatorParameter.GetsCollected = false; 92 EvaluatorParameter.Hidden = true; 93 94 Evaluator.QualityParameter.ActualName = "Makespan"; 95 } 96 #endregion 97 98 #region Methods 99 public override IDeepCloneable Clone(Cloner cloner) { 100 return new PermutationFlowshopSchedulingProblem(this, cloner); 101 } 102 103 public void Load(FSSPData data) { 104 if (data.BestKnownQuality.HasValue) { 105 BestKnownQuality = data.BestKnownQuality.Value; 106 } 107 Name = data.Name; 108 Description = data.Description; 109 JobMatrix = new DoubleMatrix(data.ProcessingTimes); 110 Encoding.Length = JobMatrix.Columns; 111 112 if (data.BestKnownSchedule != null) { 113 int[] permut = data.BestKnownSchedule; 114 //Clean up if the first index = 1 115 if (!permut.Contains(0)) { permut = permut.Select(v => v - 1).ToArray(); } 116 117 BestKnownSolution = new Permutation(PermutationTypes.Absolute, data.BestKnownSchedule); 118 BestKnownQuality = Evaluate(permut, JobMatrix); 119 } 120 } 121 public FSSPData Export() { 122 var result = new FSSPData { 123 Name = Name, 124 Description = Description, 125 ProcessingTimes = new double[JobMatrix.Rows, JobMatrix.Columns] 126 }; 127 128 result.BestKnownQuality = BestKnownQuality; 129 130 if (JobMatrix != null) { 131 result.Jobs = JobMatrix.Rows; 132 result.Machines = JobMatrix.Columns; 133 } 134 135 for (int i = 0; i < JobMatrix.Rows; i++) { 136 for (int j = 0; j < JobMatrix.Columns; j++) { 137 result.ProcessingTimes[i, j] = JobMatrix[i, j]; 66 138 } 139 } 67 140 68 public OptionalValueParameter<JobMatrix> JobMatrixParameter 69 { 70 get { return (OptionalValueParameter<JobMatrix>)Parameters["JobMatrix"]; } 141 result.BestKnownSchedule = BestKnownSolution != null ? (BestKnownSolution as IntArray).ToArray() : null; 142 143 return result; 144 } 145 146 public override double Evaluate(Individual individual, IRandom random) { 147 return Evaluate(individual.Permutation().ToArray(), JobMatrix); 148 } 149 #endregion 150 151 #region Helper Methods 152 private void OnBestKnownSolutionChanged() { 153 BestKnownSolutionChanged?.Invoke(this, EventArgs.Empty); 154 } 155 156 /// <summary> 157 /// Calculates the makespan (cMax), meaning the total time from start till the last job on the last machine is done 158 /// </summary> 159 /// <param name="permutation"></param> 160 /// <param name="matrix"></param> 161 /// <returns></returns> 162 private double Evaluate(int[] permutation, DoubleMatrix matrix) { 163 DoubleMatrix calculatedTime = new DoubleMatrix(matrix.Rows, matrix.Columns); 164 double runtimePrev; 165 166 double runtimePrevMachine; 167 double runtimePrevJobOnThisMachine; 168 169 for (var machineIdx = 0; machineIdx < matrix.Rows; machineIdx++) { 170 for (var jobIdx = 0; jobIdx < matrix.Columns; jobIdx++) { 171 runtimePrev = 0; 172 173 if (jobIdx == 0 && machineIdx == 0) { //Nothing to calculate 174 } else if (machineIdx == 0) { 175 runtimePrev = calculatedTime[machineIdx, jobIdx - 1]; 176 } else if (jobIdx == 0) { 177 runtimePrev = calculatedTime[machineIdx - 1, jobIdx]; 178 } else { 179 runtimePrevMachine = calculatedTime[machineIdx - 1, jobIdx]; 180 runtimePrevJobOnThisMachine = calculatedTime[machineIdx, jobIdx - 1]; 181 runtimePrev = runtimePrevMachine > runtimePrevJobOnThisMachine ? runtimePrevMachine : runtimePrevJobOnThisMachine; 182 } 183 calculatedTime[machineIdx, jobIdx] = matrix[machineIdx, permutation[jobIdx]] + runtimePrev; 71 184 } 72 #endregion 73 74 #region Properties 75 public Permutation BestKnownSolution 76 { 77 get { return BestKnownSolutionParameter.Value; } 78 set 79 { 80 BestKnownSolutionParameter.Value = value; 81 if (BestKnownSolutionChanged != null) { OnBestKnownSolutionChanged(); } 82 } 83 } 84 public JobMatrix JobMatrix 85 { 86 get { return JobMatrixParameter.Value; } 87 set { JobMatrixParameter.Value = value; } 88 } 89 #endregion 90 91 public event EventHandler BestKnownSolutionChanged; 92 private void OnBestKnownSolutionChanged() 93 { 94 var changed = BestKnownSolutionChanged; 95 if (changed != null) 96 changed(this, EventArgs.Empty); 97 } 98 99 [StorableConstructor] 100 private PermutationFlowshopSchedulingProblem(bool deserializing) : base(deserializing) { } 101 private PermutationFlowshopSchedulingProblem(PermutationFlowshopSchedulingProblem original, Cloner cloner) 102 : base(original, cloner) 103 { 104 } 105 public PermutationFlowshopSchedulingProblem() 106 : base(new CmaxMakeSpanEvaluator(), new RandomPermutationCreator()) 107 { 108 Parameters.Add(new OptionalValueParameter<Permutation>("BestKnownSolution", "The best known solution of this FSSP instance.")); 109 Parameters.Add(new OptionalValueParameter<JobMatrix>("JobMatrix", "The matrix which contains the jobs,machines and duration.")); 110 111 Load(DefaultInstance); 112 EvaluatorParameter.GetsCollected = false; 113 EvaluatorParameter.Hidden = true; 114 115 Maximization.Value = false; 116 MaximizationParameter.Hidden = true; 117 118 SolutionCreator.PermutationParameter.ActualName = "PFSPOrder"; 119 Evaluator.QualityParameter.ActualName = "Makespan"; 120 ParameterizeSolutionCreator(); 121 ParameterizeEvaluator(); 122 123 InitializeOperators(); 124 } 125 126 public override IDeepCloneable Clone(Cloner cloner) 127 { 128 return new PermutationFlowshopSchedulingProblem(this, cloner); 129 } 130 131 [StorableHook(HookType.AfterDeserialization)] 132 private void AfterDeserialization() { } 133 134 #region Problem Instance Handling 135 public void Load(FSSPData data) 136 { 137 138 BestKnownQuality = data.BestKnownQuality.HasValue ? new DoubleValue(data.BestKnownQuality.Value) : null; 139 Name = data.Name; 140 Description = data.Description; 141 JobMatrix = new JobMatrix(data.ProcessingTimes); 142 143 if (data.BestKnownSchedule != null) 144 { 145 int[] permut = data.BestKnownSchedule; 146 //Clean up if the first index = 1 147 if (!permut.Contains(0)) { permut = permut.Select(v => v - 1).ToArray(); } 148 double bestKnownQuality = MakeSpanEvaluator.Apply( 149 new CmaxMakeSpanEvaluator(), 150 new DoubleMatrix(data.ProcessingTimes), 151 new Permutation(PermutationTypes.Absolute, permut) 152 ); 153 154 BestKnownSolution = new Permutation(PermutationTypes.Absolute, data.BestKnownSchedule); 155 BestKnownQuality = new DoubleValue(bestKnownQuality); 156 } 157 158 ParameterizeSolutionCreator(); 159 } 160 public FSSPData Export() 161 { 162 var result = new FSSPData 163 { 164 Name = Name, 165 Description = Description, 166 ProcessingTimes = new double[JobMatrix.Rows, JobMatrix.Columns] 167 }; 168 169 if (BestKnownQuality != null) 170 { 171 result.BestKnownQuality = BestKnownQuality.Value; 172 } 173 174 if (JobMatrix != null) 175 { 176 result.Jobs = JobMatrix.Rows; 177 result.Machines = JobMatrix.Columns; 178 } 179 180 for (int i = 0; i < JobMatrix.Rows; i++) 181 { 182 for (int j = 0; j < JobMatrix.Columns; j++) 183 { 184 result.ProcessingTimes[i, j] = JobMatrix[i, j]; 185 } 186 } 187 188 result.BestKnownSchedule = BestKnownSolution != null ? (BestKnownSolution as IntArray).ToArray() : null; 189 190 return result; 191 } 192 #endregion 193 194 #region Helpers 195 private void InitializeOperators() 196 { 197 Operators.AddRange(ApplicationManager.Manager.GetInstances<IPermutationOperator>()); 198 ParameterizeOperators(); 199 } 200 private void ParameterizeOperators() 201 { 202 foreach (IPermutationCrossover op in Operators.OfType<IPermutationCrossover>()) 203 { 204 op.ParentsParameter.ActualName = SolutionCreator.PermutationParameter.ActualName; 205 op.ParentsParameter.Hidden = true; 206 op.ChildParameter.ActualName = SolutionCreator.PermutationParameter.ActualName; 207 op.ChildParameter.Hidden = true; 208 } 209 foreach (IPermutationManipulator op in Operators.OfType<IPermutationManipulator>()) 210 { 211 op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName; 212 op.PermutationParameter.Hidden = true; 213 } 214 foreach (IPermutationMoveOperator op in Operators.OfType<IPermutationMoveOperator>()) 215 { 216 op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName; 217 op.PermutationParameter.Hidden = true; 218 } 219 foreach (IPermutationMultiNeighborhoodShakingOperator op in Operators.OfType<IPermutationMultiNeighborhoodShakingOperator>()) 220 { 221 op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName; 222 op.PermutationParameter.Hidden = true; 223 } 224 foreach (ISingleObjectiveImprovementOperator op in Operators.OfType<ISingleObjectiveImprovementOperator>()) 225 { 226 op.SolutionParameter.ActualName = SolutionCreator.PermutationParameter.ActualName; 227 op.SolutionParameter.Hidden = true; 228 } 229 foreach (ISingleObjectivePathRelinker op in Operators.OfType<ISingleObjectivePathRelinker>()) 230 { 231 op.ParentsParameter.ActualName = SolutionCreator.PermutationParameter.ActualName; 232 op.ParentsParameter.Hidden = true; 233 } 234 foreach (ISolutionSimilarityCalculator op in Operators.OfType<ISolutionSimilarityCalculator>()) 235 { 236 op.SolutionVariableName = SolutionCreator.PermutationParameter.ActualName; 237 op.QualityVariableName = Evaluator.QualityParameter.ActualName; 238 } 239 } 240 private void ParameterizeSolutionCreator() 241 { 242 SolutionCreator.LengthParameter.Value = new IntValue(JobMatrix.Columns); 243 244 SolutionCreator.LengthParameter.Hidden = SolutionCreator.LengthParameter.Value != null; 245 SolutionCreator.PermutationTypeParameter.Value = new PermutationType(PermutationTypes.RelativeUndirected); 246 SolutionCreator.PermutationTypeParameter.Hidden = true; 247 } 248 private void ParameterizeEvaluator() 249 { 250 if (Evaluator is CmaxMakeSpanEvaluator) 251 { 252 IMakespanEvaluator evaluator = (IMakespanEvaluator)Evaluator; 253 evaluator.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName; 254 evaluator.PermutationParameter.Hidden = true; 255 } 256 } 257 #endregion 185 } 186 return calculatedTime[calculatedTime.Rows - 1, calculatedTime.Columns - 1]; 258 187 } 188 #endregion 189 } 259 190 } -
branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Properties/AssemblyInfo.cs
r15541 r15639 54 54 // [assembly: AssemblyVersion("1.0.*")] 55 55 [assembly: AssemblyVersion("3.3.0.0")] 56 [assembly: AssemblyFileVersion("3.3.14.155 21")]56 [assembly: AssemblyFileVersion("3.3.14.15541")] 57 57
Note: See TracChangeset
for help on using the changeset viewer.