Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
12/18/17 14:38:18 (7 years ago)
Author:
ddorfmei
Message:

#2747: Improved hard-coded genetic algorithm

  • implemented restart strategy
  • implemented 1-Opt algorithm
  • added parameters to control restart strategy and optimal assignment strategy
  • additional results: best solution found after number of generations, jobs/nests (for evaluation only)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/CFSAP/HeuristicLab.Problems.Scheduling.CFSAP/3.3/GeneticAlgorithm.cs

    r15493 r15533  
    3535
    3636namespace HeuristicLab.Problems.Scheduling.CFSAP {
     37  public enum OptimalAssignmentType { None, Polynomial, OneOpt, Both };
     38
    3739  [Item("Genetic Algorithm (CFSAP)", "")]
    3840  [StorableClass]
     
    7981      get { return pauseAfterGenerationParameter; }
    8082    }
     83    [Storable]
     84    private IFixedValueParameter<EnumValue<OptimalAssignmentType>> optimalAssignmentParameter;
     85    public IFixedValueParameter<EnumValue<OptimalAssignmentType>> OptimalAssignmentParameter {
     86      get { return optimalAssignmentParameter; }
     87    }
    8188
    8289    public int PopulationSize {
     
    103110      get { return pauseAfterGenerationParameter.Value.Value; }
    104111      set { pauseAfterGenerationParameter.Value.Value = value; }
     112    }
     113    public OptimalAssignmentType OptimalAssignment {
     114      get { return optimalAssignmentParameter.Value.Value; }
     115      set { optimalAssignmentParameter.Value.Value = value; }
    105116    }
    106117
     
    115126      maximumEvaluatedSolutionsParameter = cloner.Clone(original.maximumEvaluatedSolutionsParameter);
    116127      pauseAfterGenerationParameter = cloner.Clone(original.pauseAfterGenerationParameter);
     128      optimalAssignmentParameter = cloner.Clone(original.optimalAssignmentParameter);
     129
    117130      generation = original.generation;
    118131      evaluatedSolutions = original.evaluatedSolutions;
    119132      bestQuality = original.bestQuality;
     133
    120134      if (original.population != null)
    121135        population = original.population.Select(cloner.Clone).ToArray();
     
    126140    }
    127141    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)));
    129143      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)));
    130144      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)));
     
    132146      Parameters.Add(maximumEvaluatedSolutionsParameter = new FixedValueParameter<IntValue>("MaximumEvaluatedSolutions", "The number of evaluated solutions before the algorithm terminates.", new IntValue(100000000)));
    133147      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)));
    134149    }
    135150
     
    194209            Assignment = CrossAssignment(parent1.Assignment, parent2.Assignment)
    195210          };
     211
    196212          var mutProb = random.NextDouble();
    197213          if (mutProb < MutationProbability) {
     
    199215            MutateAssignment(nextGeneration[p].Assignment);
    200216          }
     217
    201218          nextGeneration[p].Quality = Problem.Evaluate(nextGeneration[p].Sequence, nextGeneration[p].Assignment);
    202219          evaluatedSolutions++;
    203220
    204221          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.");
    212236            }
    213             if (nextGeneration[p].Quality < bestQuality) {
     237
     238          if (nextGeneration[p].Quality < bestQuality) {
    214239              bestQuality = nextGeneration[p].Quality;
    215240              ((DoubleValue)Results["BestQuality"].Value).Value = bestQuality;
     
    232257          break;
    233258        }
     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.");
    234285      }
    235286    }
     
    257308
    258309    private void MutateSequence(Permutation sequence) {
    259       var cx = random.Next(7);
    260       switch (cx) {
     310      var m = random.Next(7);
     311      switch (m) {
    261312        case 0: InversionManipulator.Apply(random, sequence); break;
    262313        case 1: InsertionManipulator.Apply(random, sequence); break;
     
    266317        case 5: TranslocationInversionManipulator.Apply(random, sequence); break;
    267318        case 6: ScrambleManipulator.Apply(random, sequence); break;
    268         default: throw new InvalidOperationException("Crossover not defined.");
     319        default: throw new InvalidOperationException("Manipulator not defined.");
    269320      }
    270321    }
     
    284335    }
    285336
    286     private class EncodedSolution : IDeepCloneable, IComparable<EncodedSolution> {
     337    [StorableClass]
     338    private class EncodedSolution : DeepCloneable, IComparable<EncodedSolution> {
     339      [Storable]
    287340      public Permutation Sequence { get; set; }
     341      [Storable]
    288342      public BinaryVector Assignment { get; set; }
     343      [Storable]
    289344      public double Quality { get; set; }
    290345
    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);
    301359      }
    302360
Note: See TracChangeset for help on using the changeset viewer.