Changeset 15001 for branches/jschiess/HeuristicLab.Algorithms.SimulatedAnnealing/3.4/TemperatureController.cs
- Timestamp:
- 05/30/17 07:50:37 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/jschiess/HeuristicLab.Algorithms.SimulatedAnnealing/3.4/TemperatureController.cs
r14702 r15001 30 30 using HeuristicLab.Parameters; 31 31 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 32 using HeuristicLab.Optimization; 32 33 33 34 namespace HeuristicLab.Algorithms.SimulatedAnnealing … … 41 42 private const string AnnealingOperatorName = "AnnealingOperator"; 42 43 private const string MaximumIterationsName = "MaximumIterations"; 44 private const string InitialTemperatureName = "InitialTemperature"; 43 45 private const string LowerTemperatureName = "LowerTemperature"; 44 46 private const string IterationsName = "Iterations"; … … 49 51 private const string TemperatureName = "Temperature"; 50 52 private const string IsAcceptedName = "IsAccepted"; 53 private const string ConsecutiveRejectedSolutionsCountName = "ConsecutiveRejectedSolutions"; 54 private const string AverageAcceptanceRatioName = "AverageAcceptanceRatio"; 51 55 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 53 64 #endregion 54 65 … … 58 69 get { return (ILookupParameter<DoubleValue>)Parameters[TemperatureName]; } 59 70 } 71 public ILookupParameter<DoubleValue> InitialTemperatureParameter 72 { 73 get { return (ILookupParameter<DoubleValue>)Parameters[InitialTemperatureName]; } 74 } 60 75 public IValueLookupParameter<DoubleValue> LowerTemperatureParameter 61 76 { … … 102 117 get { return (ILookupParameter<ItemList<BoolValue>>)Parameters[AcceptanceMemoryName]; } 103 118 } 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]; } 107 146 } 108 147 #endregion … … 118 157 Parameters.Add(new LookupParameter<IntValue>(IterationsName, "The number of iterations.")); 119 158 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.")); 120 160 Parameters.Add(new ValueLookupParameter<IOperator>(AnnealingOperatorName, "The operator that cools the temperature.")); 121 161 Parameters.Add(new ValueLookupParameter<IReheatingOperator>(ReheatingOperatorName, "The operator that reheats the temperature if necessary.")); … … 126 166 Parameters.Add(new LookupParameter<BoolValue>(IsAcceptedName, "Whether the move was accepted or not.")); 127 167 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 129 177 } 130 178 … … 136 184 public override IOperation Apply() 137 185 { 138 return new OperationCollection { 186 var uphillMoves = UphillMovesMemoryParameter.ActualValue; 187 if (!InitialTemperatureFound()) 188 { 189 return findInitialTemperature(); 190 }else 191 { 192 return new OperationCollection { 139 193 ExecutionContext.CreateOperation(ReheatingOperatorParameter.ActualValue), 140 194 base.Apply() 141 195 }; 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; 142 245 } 143 246 }
Note: See TracChangeset
for help on using the changeset viewer.