Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
05/30/17 07:50:37 (7 years ago)
Author:
jschiess
Message:

#1836 SA reheating strategies: Newest version of reheating

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/jschiess/HeuristicLab.Algorithms.SimulatedAnnealing/3.4/TemperatureController.cs

    r14702 r15001  
    3030using HeuristicLab.Parameters;
    3131using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     32using HeuristicLab.Optimization;
    3233
    3334namespace HeuristicLab.Algorithms.SimulatedAnnealing
     
    4142        private const string AnnealingOperatorName = "AnnealingOperator";
    4243        private const string MaximumIterationsName = "MaximumIterations";
     44        private const string InitialTemperatureName = "InitialTemperature";
    4345        private const string LowerTemperatureName = "LowerTemperature";
    4446        private const string IterationsName = "Iterations";
     
    4951        private const string TemperatureName = "Temperature";
    5052        private const string IsAcceptedName = "IsAccepted";
     53        private const string ConsecutiveRejectedSolutionsCountName = "ConsecutiveRejectedSolutions";
     54        private const string AverageAcceptanceRatioName = "AverageAcceptanceRatio";
    5155        private const string AcceptanceMemoryName = "AcceptanceMemory";
    52         private const string ReheatCountName = "ReheatCount";
     56        private const string LastQualityName = "LastQuality";
     57        private const string UphillMovesMemoryName = "UphillMovesMemory";
     58        private const string MaximizationName = "Maximization";
     59        private const string MoveQualityName = "MoveQuality";
     60        private const string InitialAcceptanceRateName = "InitialAcceptanceRate";
     61        private const string ResultsName = "Results";
     62        private const string CalculatedInitialTemperatureName = "CalculatedInitialTemperature";
     63
    5364        #endregion
    5465
     
    5869            get { return (ILookupParameter<DoubleValue>)Parameters[TemperatureName]; }
    5970        }
     71        public ILookupParameter<DoubleValue> InitialTemperatureParameter
     72        {
     73            get { return (ILookupParameter<DoubleValue>)Parameters[InitialTemperatureName]; }
     74        }
    6075        public IValueLookupParameter<DoubleValue> LowerTemperatureParameter
    6176        {
     
    102117            get { return (ILookupParameter<ItemList<BoolValue>>)Parameters[AcceptanceMemoryName]; }
    103118        }
    104         public ILookupParameter<IntValue> ReheatCountParameter
    105         {
    106             get { return (ILookupParameter<IntValue>)Parameters[ReheatCountName]; }
     119        public ILookupParameter<ItemList<DoubleValue>> UphillMovesMemoryParameter
     120        {
     121            get { return (ILookupParameter<ItemList<DoubleValue>>)Parameters[UphillMovesMemoryName]; }
     122        }
     123        public ILookupParameter<DoubleValue> MoveQualityParameter
     124        {
     125            get { return (ILookupParameter<DoubleValue>)Parameters[MoveQualityName]; }
     126        }
     127        public ILookupParameter<DoubleValue> LastQualityParameter
     128        {
     129            get { return (ILookupParameter<DoubleValue>)Parameters[LastQualityName]; }
     130        }
     131        public IValueLookupParameter<BoolValue> MaximizationParameter
     132        {
     133            get { return (IValueLookupParameter<BoolValue>)Parameters[MaximizationName]; }
     134        }
     135        public ILookupParameter<DoubleValue> InitialAcceptanceRateParameter
     136        {
     137            get { return (ILookupParameter<DoubleValue>)Parameters[InitialAcceptanceRateName]; }
     138        }
     139        public ILookupParameter<IntValue> ConsecutiveRejectedSolutionsCountParameter
     140        {
     141            get { return (ILookupParameter<IntValue>)Parameters[ConsecutiveRejectedSolutionsCountName]; }
     142        }
     143        public ILookupParameter<DoubleValue> AverageAcceptanceRatioParameter
     144        {
     145            get { return (ILookupParameter<DoubleValue>)Parameters[AverageAcceptanceRatioName]; }
    107146        }
    108147        #endregion
     
    118157            Parameters.Add(new LookupParameter<IntValue>(IterationsName, "The number of iterations."));
    119158            Parameters.Add(new ValueLookupParameter<IntValue>(MaximumIterationsName, "The maximum number of iterations which should be processed."));
     159            Parameters.Add(new ValueLookupParameter<BoolValue>(MaximizationName, "True if the problem is a maximization problem, otherwise false."));
    120160            Parameters.Add(new ValueLookupParameter<IOperator>(AnnealingOperatorName, "The operator that cools the temperature."));
    121161            Parameters.Add(new ValueLookupParameter<IReheatingOperator>(ReheatingOperatorName, "The operator that reheats the temperature if necessary."));
     
    126166            Parameters.Add(new LookupParameter<BoolValue>(IsAcceptedName, "Whether the move was accepted or not."));
    127167            Parameters.Add(new LookupParameter<ItemList<BoolValue>>(AcceptanceMemoryName, "Memorizes the last N acceptance decisions."));
    128             Parameters.Add(new LookupParameter<IntValue>(ReheatCountName, "The number of reheats."));
     168            Parameters.Add(new LookupParameter<DoubleValue>(InitialTemperatureName, "The initial temperature."));
     169
     170            Parameters.Add(new LookupParameter<ItemList<DoubleValue>>(UphillMovesMemoryName, "Memorizes the last 100 uphill moves."));
     171            Parameters.Add(new LookupParameter<DoubleValue>(MoveQualityName, "The value which represents the quality of a move."));
     172            Parameters.Add(new LookupParameter<DoubleValue>(LastQualityName, "The value which represents the quality of the last move."));
     173            Parameters.Add(new LookupParameter<DoubleValue>(InitialAcceptanceRateName, "The initial acceptance rate of average-sized hills used to calculate the initial temperature."));
     174            Parameters.Add(new LookupParameter<IntValue>(ConsecutiveRejectedSolutionsCountName, "Amount of consecutive rejected solutions."));
     175            Parameters.Add(new LookupParameter<DoubleValue>(AverageAcceptanceRatioName, "Average acceptance over full acceptance memory."));
     176
    129177        }
    130178
     
    136184        public override IOperation Apply()
    137185        {
    138             return new OperationCollection {
     186            var uphillMoves = UphillMovesMemoryParameter.ActualValue;
     187            if (!InitialTemperatureFound())
     188            {
     189                return findInitialTemperature();
     190            }else
     191            {
     192                return new OperationCollection {
    139193                    ExecutionContext.CreateOperation(ReheatingOperatorParameter.ActualValue),
    140194                    base.Apply()
    141195                };
     196            }
     197        }
     198
     199        private IOperation findInitialTemperature()
     200        {
     201            var currentQuality = MoveQualityParameter.ActualValue.Value;
     202            var lastQuality = LastQualityParameter.ActualValue.Value;
     203            var isMaximation = MaximizationParameter.ActualValue.Value;
     204            var hillMemory = UphillMovesMemoryParameter.ActualValue;
     205           
     206            if(lastQuality != -1)
     207            {
     208                double hillSize = CalculateHillSize(lastQuality, currentQuality, isMaximation);
     209               
     210                if(hillSize > 0)
     211                {
     212                    hillMemory.Add(new DoubleValue(hillSize));
     213                    if(InitialTemperatureFound())
     214                    {
     215                        var results = (ResultCollection)ExecutionContext.Parent.Scope.Variables[ResultsName].Value;
     216                        var initialTemperature = CalculateInitialTemperatureBasedOnAverageHillSize(hillMemory);
     217                        InitialTemperatureParameter.ActualValue.Value = initialTemperature;
     218                        TemperatureParameter.ActualValue.Value = initialTemperature;
     219                        TemperatureStartIndexParameter.ActualValue.Value = Math.Max(0, IterationsParameter.ActualValue.Value - 1);
     220                        StartTemperatureParameter.ActualValue.Value = TemperatureParameter.ActualValue.Value;
     221                        results.Add(new Result(CalculatedInitialTemperatureName, new DoubleValue(initialTemperature)));
     222                    }
     223                }
     224            }
     225
     226            LastQualityParameter.ActualValue.Value = currentQuality;
     227            return base.Apply();
     228        }
     229
     230        private double CalculateInitialTemperatureBasedOnAverageHillSize(ItemList<DoubleValue> hillMemory)
     231        {
     232            var averageHillSize = hillMemory.Average(x => x.Value);
     233            return -(averageHillSize / Math.Log(InitialAcceptanceRateParameter.ActualValue.Value));
     234
     235        }
     236
     237        private double CalculateHillSize(double lastQuality, double currentQuality, bool isMaximation)
     238        {
     239            return isMaximation ? lastQuality - currentQuality : currentQuality - lastQuality;
     240        }
     241
     242        private bool InitialTemperatureFound()
     243        {
     244            return UphillMovesMemoryParameter.ActualValue.Count == 100;
    142245        }
    143246    }
Note: See TracChangeset for help on using the changeset viewer.