Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
01/22/18 17:15:29 (6 years ago)
Author:
fholzing
Message:

#2864: Adapted PFSP and LOP to the new BasicProblem

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  
    8888  </ItemGroup>
    8989  <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" />
    9690    <Compile Include="PermutationFlowshopSchedulingProblem.cs" />
    9791    <Compile Include="Plugin.cs" />
  • branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/PermutationFlowshopSchedulingProblem.cs

    r15541 r15639  
    11#region License Information
    22/* HeuristicLab
    3  * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
     3 * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
    44 *
    55 * This file is part of HeuristicLab.
     
    2121
    2222using System;
    23 using System.Drawing;
    2423using System.Linq;
    2524using HeuristicLab.Common;
     
    2928using HeuristicLab.Parameters;
    3029using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    31 using HeuristicLab.PluginInfrastructure;
    3230using HeuristicLab.Problems.Instances;
    3331using HeuristicLab.Optimization;
    34 using System.Collections.Generic;
    3532
    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[,] {
     33namespace 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[,] {
    5246                {5 ,3, 6 ,6 },
    5347                {2 ,4, 8 ,4},
     
    5549                {5 ,3, 8 ,6}
    5650            }
    57         };
    58         #endregion
     51    };
     52    public event EventHandler BestKnownSolutionChanged;
     53    #endregion
    5954
    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    }
    6178
    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];
    66138        }
     139      }
    67140
    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;
    71184        }
    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];
    258187    }
     188    #endregion
     189  }
    259190}
  • branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Properties/AssemblyInfo.cs

    r15541 r15639  
    5454// [assembly: AssemblyVersion("1.0.*")]
    5555[assembly: AssemblyVersion("3.3.0.0")]
    56 [assembly: AssemblyFileVersion("3.3.14.15521")]
     56[assembly: AssemblyFileVersion("3.3.14.15541")]
    5757
Note: See TracChangeset for help on using the changeset viewer.