Changeset 14614
- Timestamp:
- 01/27/17 09:58:48 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/MOCMAEvolutionStrategy/HeuristicLab.Algorithms.MOCMAEvolutionStrategy/3.3/MOCMASEvolutionStrategy.cs
r14612 r14614 42 42 [StorableClass] 43 43 public class MOCMASEvolutionStrategy : BasicAlgorithm { 44 public override Type ProblemType 45 { 44 public override Type ProblemType { 46 45 get { return typeof(MultiObjectiveBasicProblem<RealVectorEncoding>); } 47 46 } 48 public new MultiObjectiveBasicProblem<RealVectorEncoding> Problem 49 { 47 public new MultiObjectiveBasicProblem<RealVectorEncoding> Problem { 50 48 get { return (MultiObjectiveBasicProblem<RealVectorEncoding>)base.Problem; } 51 49 set { base.Problem = value; } 52 50 } 53 public override bool SupportsPause 54 { 55 get { return false; } 51 public override bool SupportsPause { 52 get { return true; } 56 53 } 57 54 … … 90 87 91 88 #region ParameterProperties 92 public IFixedValueParameter<IntValue> MaximumRuntimeParameter 93 { 89 public IFixedValueParameter<IntValue> MaximumRuntimeParameter { 94 90 get { return (IFixedValueParameter<IntValue>)Parameters[MaximumRuntimeName]; } 95 91 } 96 public IFixedValueParameter<IntValue> SeedParameter 97 { 92 public IFixedValueParameter<IntValue> SeedParameter { 98 93 get { return (IFixedValueParameter<IntValue>)Parameters[SeedName]; } 99 94 } 100 public FixedValueParameter<BoolValue> SetSeedRandomlyParameter 101 { 95 public FixedValueParameter<BoolValue> SetSeedRandomlyParameter { 102 96 get { return (FixedValueParameter<BoolValue>)Parameters[SetSeedRandomlyName]; } 103 97 } 104 public IFixedValueParameter<IntValue> PopulationSizeParameter 105 { 98 public IFixedValueParameter<IntValue> PopulationSizeParameter { 106 99 get { return (IFixedValueParameter<IntValue>)Parameters[PopulationSizeName]; } 107 100 } 108 public IFixedValueParameter<IntValue> MaximumGenerationsParameter 109 { 101 public IFixedValueParameter<IntValue> MaximumGenerationsParameter { 110 102 get { return (IFixedValueParameter<IntValue>)Parameters[MaximumGenerationsName]; } 111 103 } 112 public IFixedValueParameter<IntValue> MaximumEvaluatedSolutionsParameter 113 { 104 public IFixedValueParameter<IntValue> MaximumEvaluatedSolutionsParameter { 114 105 get { return (IFixedValueParameter<IntValue>)Parameters[MaximumEvaluatedSolutionsName]; } 115 106 } 116 public IFixedValueParameter<DoubleValue> InitialSigmaParameter 117 { 118 get { return (IFixedValueParameter<DoubleValue>)Parameters[InitialSigmaName]; } 119 } 120 public IConstrainedValueParameter<IIndicator> IndicatorParameter 121 { 107 public IValueParameter<DoubleArray> InitialSigmaParameter { 108 get { return (IValueParameter<DoubleArray>)Parameters[InitialSigmaName]; } 109 } 110 public IConstrainedValueParameter<IIndicator> IndicatorParameter { 122 111 get { return (IConstrainedValueParameter<IIndicator>)Parameters[IndicatorName]; } 123 112 } … … 125 114 126 115 #region Properties 127 public int MaximumRuntime 128 { 116 public int MaximumRuntime { 129 117 get { return MaximumRuntimeParameter.Value.Value; } 130 118 set { MaximumRuntimeParameter.Value.Value = value; } 131 119 } 132 public int Seed 133 { 120 public int Seed { 134 121 get { return SeedParameter.Value.Value; } 135 122 set { SeedParameter.Value.Value = value; } 136 123 } 137 public bool SetSeedRandomly 138 { 124 public bool SetSeedRandomly { 139 125 get { return SetSeedRandomlyParameter.Value.Value; } 140 126 set { SetSeedRandomlyParameter.Value.Value = value; } 141 127 } 142 public int PopulationSize 143 { 128 public int PopulationSize { 144 129 get { return PopulationSizeParameter.Value.Value; } 145 130 set { PopulationSizeParameter.Value.Value = value; } 146 131 } 147 public int MaximumGenerations 148 { 132 public int MaximumGenerations { 149 133 get { return MaximumGenerationsParameter.Value.Value; } 150 134 set { MaximumGenerationsParameter.Value.Value = value; } 151 135 } 152 public int MaximumEvaluatedSolutions 153 { 136 public int MaximumEvaluatedSolutions { 154 137 get { return MaximumEvaluatedSolutionsParameter.Value.Value; } 155 138 set { MaximumEvaluatedSolutionsParameter.Value.Value = value; } 156 139 } 157 public double InitialSigma 158 { 159 get { return InitialSigmaParameter.Value.Value; } 160 set { InitialSigmaParameter.Value.Value = value; } 161 } 162 public IIndicator Indicator 163 { 140 public DoubleArray InitialSigma { 141 get { return InitialSigmaParameter.Value; } 142 set { InitialSigmaParameter.Value = value; } 143 } 144 public IIndicator Indicator { 164 145 get { return IndicatorParameter.Value; } 165 146 set { IndicatorParameter.Value = value; } … … 170 151 171 152 #region ResultsProperties 172 private int ResultsEvaluations 173 { 153 private int ResultsEvaluations { 174 154 get { return ((IntValue)Results[EvaluationsResultName].Value).Value; } 175 155 set { ((IntValue)Results[EvaluationsResultName].Value).Value = value; } 176 156 } 177 private int ResultsIterations 178 { 157 private int ResultsIterations { 179 158 get { return ((IntValue)Results[IterationsResultName].Value).Value; } 180 159 set { ((IntValue)Results[IterationsResultName].Value).Value = value; } 181 160 } 182 161 #region Datatable 183 private DataTable ResultsQualities 184 { 162 private DataTable ResultsQualities { 185 163 get { return (DataTable)Results[TimetableResultName].Value; } 186 164 } 187 private DataRow ResultsBestHypervolumeDataLine 188 { 165 private DataRow ResultsBestHypervolumeDataLine { 189 166 get { return ResultsQualities.Rows[BestHypervolumeResultName]; } 190 167 } 191 private DataRow ResultsHypervolumeDataLine 192 { 168 private DataRow ResultsHypervolumeDataLine { 193 169 get { return ResultsQualities.Rows[HypervolumeResultName]; } 194 170 } 195 private DataRow ResultsGenerationalDistanceDataLine 196 { 171 private DataRow ResultsGenerationalDistanceDataLine { 197 172 get { return ResultsQualities.Rows[GenerationalDistanceResultName]; } 198 173 } 199 private DataRow ResultsInvertedGenerationalDistanceDataLine 200 { 174 private DataRow ResultsInvertedGenerationalDistanceDataLine { 201 175 get { return ResultsQualities.Rows[InvertedGenerationalDistanceResultName]; } 202 176 } 203 private DataRow ResultsCrowdingDataLine 204 { 177 private DataRow ResultsCrowdingDataLine { 205 178 get { return ResultsQualities.Rows[CrowdingResultName]; } 206 179 } 207 private DataRow ResultsSpacingDataLine 208 { 180 private DataRow ResultsSpacingDataLine { 209 181 get { return ResultsQualities.Rows[SpacingResultName]; } 210 182 } 211 private DataRow ResultsHypervolumeDifferenceDataLine 212 { 183 private DataRow ResultsHypervolumeDifferenceDataLine { 213 184 get { return ResultsQualities.Rows[DifferenceToBestKnownHypervolumeResultName]; } 214 185 } 215 186 #endregion 216 187 //QualityIndicators 217 private double ResultsHypervolume 218 { 188 private double ResultsHypervolume { 219 189 get { return ((DoubleValue)Results[HypervolumeResultName].Value).Value; } 220 190 set { ((DoubleValue)Results[HypervolumeResultName].Value).Value = value; } 221 191 } 222 private double ResultsGenerationalDistance 223 { 192 private double ResultsGenerationalDistance { 224 193 get { return ((DoubleValue)Results[GenerationalDistanceResultName].Value).Value; } 225 194 set { ((DoubleValue)Results[GenerationalDistanceResultName].Value).Value = value; } 226 195 } 227 private double ResultsInvertedGenerationalDistance 228 { 196 private double ResultsInvertedGenerationalDistance { 229 197 get { return ((DoubleValue)Results[InvertedGenerationalDistanceResultName].Value).Value; } 230 198 set { ((DoubleValue)Results[InvertedGenerationalDistanceResultName].Value).Value = value; } 231 199 } 232 private double ResultsCrowding 233 { 200 private double ResultsCrowding { 234 201 get { return ((DoubleValue)Results[CrowdingResultName].Value).Value; } 235 202 set { ((DoubleValue)Results[CrowdingResultName].Value).Value = value; } 236 203 } 237 private double ResultsSpacing 238 { 204 private double ResultsSpacing { 239 205 get { return ((DoubleValue)Results[SpacingResultName].Value).Value; } 240 206 set { ((DoubleValue)Results[SpacingResultName].Value).Value = value; } 241 207 } 242 private double ResultsBestHypervolume 243 { 208 private double ResultsBestHypervolume { 244 209 get { return ((DoubleValue)Results[BestHypervolumeResultName].Value).Value; } 245 210 set { ((DoubleValue)Results[BestHypervolumeResultName].Value).Value = value; } 246 211 } 247 private double ResultsBestKnownHypervolume 248 { 212 private double ResultsBestKnownHypervolume { 249 213 get { return ((DoubleValue)Results[BestKnownHypervolumeResultName].Value).Value; } 250 214 set { ((DoubleValue)Results[BestKnownHypervolumeResultName].Value).Value = value; } 251 215 } 252 private double ResultsDifferenceBestKnownHypervolume 253 { 216 private double ResultsDifferenceBestKnownHypervolume { 254 217 get { return ((DoubleValue)Results[DifferenceToBestKnownHypervolumeResultName].Value).Value; } 255 218 set { ((DoubleValue)Results[DifferenceToBestKnownHypervolumeResultName].Value).Value = value; } … … 257 220 } 258 221 //Solutions 259 private DoubleMatrix ResultsSolutions 260 { 222 private DoubleMatrix ResultsSolutions { 261 223 get { return ((DoubleMatrix)Results[CurrentFrontResultName].Value); } 262 224 set { Results[CurrentFrontResultName].Value = value; } 263 225 } 264 private ScatterPlotContent ResultsScatterPlot 265 { 226 private ScatterPlotContent ResultsScatterPlot { 266 227 get { return ((ScatterPlotContent)Results[ScatterPlotResultName].Value); } 267 228 set { Results[ScatterPlotResultName].Value = value; } … … 275 236 Parameters.Add(new FixedValueParameter<BoolValue>(SetSeedRandomlyName, "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true))); 276 237 Parameters.Add(new FixedValueParameter<IntValue>(PopulationSizeName, "λ (lambda) - the size of the offspring population.", new IntValue(20))); 277 Parameters.Add(new FixedValueParameter<DoubleValue>(InitialSigmaName, "The initial sigma is a single value > 0.", new DoubleValue(0.5)));238 Parameters.Add(new ValueParameter<DoubleArray>(InitialSigmaName, "The initial sigma can be a single value or a value for each dimension. All values need to be > 0.", new DoubleArray(new[] { 0.5 }))); 278 239 Parameters.Add(new FixedValueParameter<IntValue>(MaximumGenerationsName, "The maximum number of generations which should be processed.", new IntValue(1000))); 279 240 Parameters.Add(new FixedValueParameter<IntValue>(MaximumEvaluatedSolutionsName, "The maximum number of evaluated solutions that should be computed.", new IntValue(int.MaxValue))); … … 289 250 290 251 #region Mainloop 291 protected override void Run(CancellationToken cancellationToken) { 292 // Set up the algorithm252 253 protected override void Initialize(CancellationToken cancellationToken) { 293 254 if (SetSeedRandomly) Seed = new System.Random().Next(); 294 255 random.Reset(Seed); … … 300 261 AnalyzeSolutions(); 301 262 263 ResultsIterations = 1; 264 } 265 266 protected override void Run(CancellationToken cancellationToken) { 302 267 // Loop until iteration limit reached or canceled. 303 for (ResultsIterations = 1; ResultsIterations < MaximumGenerations; ResultsIterations++) {268 while (ResultsIterations < MaximumGenerations) { 304 269 try { 305 270 Iterate(); 271 ResultsIterations++; 306 272 cancellationToken.ThrowIfCancellationRequested(); 307 } 308 finally { 273 } finally { 309 274 AnalyzeSolutions(); 310 275 } … … 328 293 #region Initialization 329 294 private MOCMAESIndividual InitializeIndividual(RealVector x) { 330 var zeros = new RealVector(Enumerable.Range(0, Problem.Encoding.Length).Select(i => (Problem.Encoding.Bounds[i, 1] + Problem.Encoding.Bounds[i, 0]) / 2).ToArray()); 331 var identity = new double[x.Length, x.Length]; 332 for (var i = 0; i < x.Length; i++) identity[i, i] = (Problem.Encoding.Bounds[i % Problem.Encoding.Bounds.Rows, 1] - Problem.Encoding.Bounds[i % Problem.Encoding.Bounds.Rows, 0]); 333 return new MOCMAESIndividual(x, internals.TargetSuccessProbability, InitialSigma, zeros, identity, internals); 295 var zeros = new RealVector(x.Length); 296 var c = new double[x.Length, x.Length]; 297 double sigma = InitialSigma.Max(); 298 for (var i = 0; i < x.Length; i++) { 299 double d = InitialSigma[i % InitialSigma.Length] / sigma; 300 c[i, i] = d * d; 301 } 302 return new MOCMAESIndividual(x, internals.TargetSuccessProbability, sigma, zeros, c, internals); 334 303 } 335 304 private void InitSolutions() {
Note: See TracChangeset
for help on using the changeset viewer.