- Timestamp:
- 12/18/17 14:38:18 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/CFSAP/HeuristicLab.Problems.Scheduling.CFSAP/3.3/GeneticAlgorithm.cs
r15493 r15533 35 35 36 36 namespace HeuristicLab.Problems.Scheduling.CFSAP { 37 public enum OptimalAssignmentType { None, Polynomial, OneOpt, Both }; 38 37 39 [Item("Genetic Algorithm (CFSAP)", "")] 38 40 [StorableClass] … … 79 81 get { return pauseAfterGenerationParameter; } 80 82 } 83 [Storable] 84 private IFixedValueParameter<EnumValue<OptimalAssignmentType>> optimalAssignmentParameter; 85 public IFixedValueParameter<EnumValue<OptimalAssignmentType>> OptimalAssignmentParameter { 86 get { return optimalAssignmentParameter; } 87 } 81 88 82 89 public int PopulationSize { … … 103 110 get { return pauseAfterGenerationParameter.Value.Value; } 104 111 set { pauseAfterGenerationParameter.Value.Value = value; } 112 } 113 public OptimalAssignmentType OptimalAssignment { 114 get { return optimalAssignmentParameter.Value.Value; } 115 set { optimalAssignmentParameter.Value.Value = value; } 105 116 } 106 117 … … 115 126 maximumEvaluatedSolutionsParameter = cloner.Clone(original.maximumEvaluatedSolutionsParameter); 116 127 pauseAfterGenerationParameter = cloner.Clone(original.pauseAfterGenerationParameter); 128 optimalAssignmentParameter = cloner.Clone(original.optimalAssignmentParameter); 129 117 130 generation = original.generation; 118 131 evaluatedSolutions = original.evaluatedSolutions; 119 132 bestQuality = original.bestQuality; 133 120 134 if (original.population != null) 121 135 population = original.population.Select(cloner.Clone).ToArray(); … … 126 140 } 127 141 public GeneticAlgorithm() { 128 Parameters.Add(populationSizeParameter = new FixedValueParameter<IntValue>("PopulationSize", "The size of the population, each individual of the population is a solution with a permutation and a binary vector.", new IntValue( 100)));142 Parameters.Add(populationSizeParameter = new FixedValueParameter<IntValue>("PopulationSize", "The size of the population, each individual of the population is a solution with a permutation and a binary vector.", new IntValue(500))); 129 143 Parameters.Add(elitesParameter = new FixedValueParameter<IntValue>("Elites", "The number of best individuals from the previous population that will continue to the next generation.", new IntValue(1))); 130 144 Parameters.Add(mutationProbabilityParameter = new FixedValueParameter<PercentValue>("MutationProbability", "The probability that an individual should be mutated after it has been created through crossover.", new PercentValue(0.05))); … … 132 146 Parameters.Add(maximumEvaluatedSolutionsParameter = new FixedValueParameter<IntValue>("MaximumEvaluatedSolutions", "The number of evaluated solutions before the algorithm terminates.", new IntValue(100000000))); 133 147 Parameters.Add(pauseAfterGenerationParameter = new FixedValueParameter<BoolValue>("PauseAfterGeneration", "Whether the algorithm should pause after each generation.", new BoolValue(true))); 148 Parameters.Add(optimalAssignmentParameter = new FixedValueParameter<EnumValue<OptimalAssignmentType>>("OptimalAssignment", "Which optimal assignment strategy should be used.", new EnumValue<OptimalAssignmentType>(OptimalAssignmentType.Polynomial))); 134 149 } 135 150 … … 194 209 Assignment = CrossAssignment(parent1.Assignment, parent2.Assignment) 195 210 }; 211 196 212 var mutProb = random.NextDouble(); 197 213 if (mutProb < MutationProbability) { … … 199 215 MutateAssignment(nextGeneration[p].Assignment); 200 216 } 217 201 218 nextGeneration[p].Quality = Problem.Evaluate(nextGeneration[p].Sequence, nextGeneration[p].Assignment); 202 219 evaluatedSolutions++; 203 220 204 221 if (nextGeneration[p].Quality <= bestQuality) { 205 if (!optimalSequences.Contains(nextGeneration[p].Sequence)) { 206 int cycleTime; 207 var assignment = OptimalAssignment.MakeAssignment(nextGeneration[p].Sequence, Problem.ProcessingTimes, Problem.SetupTimes, out cycleTime); 208 evaluatedSolutions++; 209 nextGeneration[p].Assignment = new BinaryVector(assignment.Select(x => x == 1).ToArray()); 210 nextGeneration[p].Quality = cycleTime; 211 optimalSequences.Add(nextGeneration[p].Sequence); 222 switch (OptimalAssignment) { 223 case OptimalAssignmentType.None: 224 break; 225 case OptimalAssignmentType.Polynomial: 226 OptimalPolynomialAssignment(nextGeneration[p]); 227 break; 228 case OptimalAssignmentType.OneOpt: 229 OneOptAssignment(nextGeneration[p]); 230 break; 231 case OptimalAssignmentType.Both: 232 HybridAssignment(nextGeneration[p]); 233 break; 234 default: 235 throw new InvalidOperationException("Optimal assignment strategy not defined."); 212 236 } 213 if (nextGeneration[p].Quality < bestQuality) { 237 238 if (nextGeneration[p].Quality < bestQuality) { 214 239 bestQuality = nextGeneration[p].Quality; 215 240 ((DoubleValue)Results["BestQuality"].Value).Value = bestQuality; … … 232 257 break; 233 258 } 259 } 260 } 261 262 private void OptimalPolynomialAssignment(EncodedSolution generation) { 263 if (!optimalSequences.Contains(generation.Sequence)) { 264 var assignment = Scheduling.CFSAP.OptimalPolynomialAssignment.MakeAssignment(generation.Sequence, Problem.ProcessingTimes, Problem.SetupTimes, out var cycleTime); 265 evaluatedSolutions++; 266 generation.Assignment = new BinaryVector(assignment.Select(x => x == 1).ToArray()); 267 generation.Quality = cycleTime; 268 optimalSequences.Add(generation.Sequence); 269 } 270 } 271 272 private void OneOptAssignment(EncodedSolution generation) { 273 var assignment = Scheduling.CFSAP.OneOptAssignment.MakeAssignment(generation.Sequence, generation.Assignment, Problem.ProcessingTimes, Problem.SetupTimes, out var cycleTime); 274 evaluatedSolutions++; 275 generation.Assignment = assignment; 276 generation.Quality = cycleTime; 277 } 278 279 private void HybridAssignment(EncodedSolution generation) { 280 var a = random.Next(2); 281 switch (a) { 282 case 0: OptimalPolynomialAssignment(generation); break; 283 case 1: OneOptAssignment(generation); break; 284 default: throw new InvalidOperationException("Assignment not defined."); 234 285 } 235 286 } … … 257 308 258 309 private void MutateSequence(Permutation sequence) { 259 var cx= random.Next(7);260 switch ( cx) {310 var m = random.Next(7); 311 switch (m) { 261 312 case 0: InversionManipulator.Apply(random, sequence); break; 262 313 case 1: InsertionManipulator.Apply(random, sequence); break; … … 266 317 case 5: TranslocationInversionManipulator.Apply(random, sequence); break; 267 318 case 6: ScrambleManipulator.Apply(random, sequence); break; 268 default: throw new InvalidOperationException(" Crossover not defined.");319 default: throw new InvalidOperationException("Manipulator not defined."); 269 320 } 270 321 } … … 284 335 } 285 336 286 private class EncodedSolution : IDeepCloneable, IComparable<EncodedSolution> { 337 [StorableClass] 338 private class EncodedSolution : DeepCloneable, IComparable<EncodedSolution> { 339 [Storable] 287 340 public Permutation Sequence { get; set; } 341 [Storable] 288 342 public BinaryVector Assignment { get; set; } 343 [Storable] 289 344 public double Quality { get; set; } 290 345 291 public IDeepCloneable Clone(Cloner cloner) { 292 return new EncodedSolution() { 293 Sequence = cloner.Clone(this.Sequence), 294 Assignment = cloner.Clone(this.Assignment), 295 Quality = this.Quality 296 }; 297 } 298 299 public object Clone() { 300 return Clone(new Cloner()); 346 [StorableConstructor] 347 private EncodedSolution(bool deserializing) { } 348 349 private EncodedSolution(EncodedSolution original, Cloner cloner) : base(original, cloner) { 350 Sequence = cloner.Clone(original.Sequence); 351 Assignment = cloner.Clone(original.Assignment); 352 Quality = original.Quality; 353 } 354 355 public EncodedSolution() { } 356 357 public override IDeepCloneable Clone(Cloner cloner) { 358 return new EncodedSolution(this, cloner); 301 359 } 302 360
Note: See TracChangeset
for help on using the changeset viewer.