Changeset 13743 for branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/UnderstandingSolutionsView.cs
- Timestamp:
- 04/06/16 12:00:09 (8 years ago)
- Location:
- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3
- Property svn:ignore
-
old new 2 2 obj 3 3 Plugin.cs 4 *.user
-
- Property svn:ignore
-
branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/UnderstandingSolutionsView.cs
r13722 r13743 28 28 using HeuristicLab.Optimization; 29 29 using HeuristicLab.OptimizationExpertSystem.Common; 30 using HeuristicLab.Random; 30 31 using System; 31 32 using System.Collections.Generic; … … 42 43 public UnderstandingSolutionsView() { 43 44 InitializeComponent(); 45 solutionNetworkProjectionComboBox.SelectedIndex = 0; 44 46 } 45 47 … … 66 68 protected override void OnSolutionSeedingPoolChanged() { 67 69 base.OnSolutionSeedingPoolChanged(); 68 UpdateSolutionNetworkAnalysis(similarityComboBox.SelectedItem as ISolutionSimilarityCalculator );70 UpdateSolutionNetworkAnalysis(similarityComboBox.SelectedItem as ISolutionSimilarityCalculator, (string)solutionNetworkProjectionComboBox.SelectedItem); 69 71 } 70 72 … … 107 109 UpdateSolutionFdcAnalysis(calculator, fdcBetweenBestCheckBox.Checked); 108 110 UpdateSolutionLengthScaleAnalysis(calculator); 109 UpdateSolutionNetworkAnalysis(calculator );111 UpdateSolutionNetworkAnalysis(calculator, (string)solutionNetworkProjectionComboBox.SelectedItem); 110 112 } else { 111 113 solutionsDiversityViewHost.Content = null; … … 221 223 } 222 224 223 private void UpdateSolutionNetworkAnalysis(ISolutionSimilarityCalculator calculator ) {225 private void UpdateSolutionNetworkAnalysis(ISolutionSimilarityCalculator calculator, string projection) { 224 226 var series = solutionsNetworkChart.Series["SolutionSeries"]; 225 227 var seedingSeries = solutionsNetworkChart.Series["SeedingSolutionSeries"]; … … 235 237 } 236 238 } 237 var coords = MultidimensionalScaling.KruskalShepard(dissimilarities); 239 DoubleMatrix coords = null; 240 if (projection == "SOM") 241 coords = Som(dissimilarities, new MersenneTwister(42), jittering: true); 242 else coords = MultidimensionalScaling.KruskalShepard(dissimilarities); 238 243 for (var i = 0; i < coords.Rows; i++) { 239 244 var quality = GetQuality(solutionScopes[i], calculator.QualityVariableName) ?? double.NaN; … … 266 271 UpdateSolutionFdcAnalysis(calculator, fdcBetweenBestCheckBox.Checked); 267 272 UpdateSolutionLengthScaleAnalysis(calculator); 268 UpdateSolutionNetworkAnalysis(calculator );273 UpdateSolutionNetworkAnalysis(calculator, (string)solutionNetworkProjectionComboBox.SelectedItem); 269 274 } 270 275 … … 279 284 UpdateSolutionFdcAnalysis(calculator, fdcBetweenBestCheckBox.Checked); 280 285 UpdateSolutionLengthScaleAnalysis(calculator); 281 UpdateSolutionNetworkAnalysis(calculator );286 UpdateSolutionNetworkAnalysis(calculator, (string)solutionNetworkProjectionComboBox.SelectedItem); 282 287 } 283 288 … … 285 290 if (InvokeRequired) { Invoke((Action<object, EventArgs>)FdcBetweenBestCheckBoxOnCheckedChanged, sender, e); return; } 286 291 UpdateSolutionFdcAnalysis((ISolutionSimilarityCalculator)similarityComboBox.SelectedItem, fdcBetweenBestCheckBox.Checked); 292 } 293 294 private void SolutionNetworkProjectionComboBoxOnSelectedIndexChanged(object sender, EventArgs e) { 295 if (InvokeRequired) { Invoke((Action<object, EventArgs>)SolutionNetworkProjectionComboBoxOnSelectedIndexChanged, sender, e); return; } 296 var calculator = (ISolutionSimilarityCalculator)similarityComboBox.SelectedItem; 297 if (calculator != null) { 298 calculator.SolutionVariableName = (string)solutionNameComboBox.SelectedItem; 299 calculator.QualityVariableName = Content.Problem.Problem.Evaluator.QualityParameter.ActualName; 300 } 301 UpdateSolutionNetworkAnalysis(calculator, (string)solutionNetworkProjectionComboBox.SelectedItem); 287 302 } 288 303 … … 318 333 return dval.Value; 319 334 } 335 336 #region SOM projection 337 /// <summary> 338 /// This is the online algorithm described in 339 /// Olteanu, M. and Villa-Vialaneix, N. 2015. 340 /// On-line relational and multiple relational SOM. 341 /// Neurocomputing 147, pp. 15-30. 342 /// </summary> 343 /// <param name="dissimilarities">The full NxN matrix containing all dissimilarities between N points.</param> 344 /// <param name="random">The random number generator to use.</param> 345 /// <param name="somSize">The length of a side of the SOM grid (there are somSize * somSize neurons).</param> 346 /// <param name="iterations">The amount of iterations to perform in learning.</param> 347 /// <param name="learningRate">The initial learning rate.</param> 348 /// <param name="learningRadius">The initial learning radius.</param> 349 /// <param name="jittering">If the final coordinates should be jittered slightly within the grid.</param> 350 /// <returns>A matrix of coordinates having N rows and 2 columns.</returns> 351 private DoubleMatrix Som(DoubleMatrix dissimilarities, IRandom random, int somSize = 5, int iterations = 100, double learningRate = double.NaN, double learningRadius = 5.0, bool jittering = true) { 352 var K = somSize * somSize; 353 var N = dissimilarities.Rows; 354 if (double.IsNaN(learningRate)) learningRate = 1.0 / Math.Sqrt(2.0 * N); 355 var fixedLearningRate = learningRate / 10.0; 356 var varLearningRate = 9.0 * fixedLearningRate; 357 Func<int, int, double> learningRateT = (maxIter, iter) => { 358 return varLearningRate * ((maxIter - iter) / (double)maxIter) + fixedLearningRate; 359 }; 360 Func<int, int> getX = (neuron) => neuron % somSize; 361 Func<int, int> getY = (neuron) => neuron / somSize; 362 Func<int, int, int, int, double> neighborhood = (maxIter, iter, k, bmu) => { 363 var sigma = 1.0 * ((maxIter - iter) / (double)maxIter) + 0.0001; 364 var xK = getX(k); 365 var yK = getY(k); 366 var xW = getX(bmu); 367 var yW = getY(bmu); 368 var d = (xK - xW) * (xK - xW) + (yK - yW) * (yK - yW); 369 return Math.Exp(-d / (2.0 * sigma * sigma)); 370 }; 371 var alphas = Enumerable.Range(0, K).Select(k => Enumerable.Range(0, N).Select(_ => random.NextDouble()).ToArray()).ToArray(); 372 // normalize s.t. sum(alphas[k]) = 1 373 for (var k = 0; k < K; k++) { 374 var sum = alphas[k].Sum(); 375 for (var i = 0; i < alphas[k].Length; i++) alphas[k][i] /= sum; 376 } 377 var oldAlphas = alphas.Select(x => (double[])x.Clone()).ToArray(); 378 379 for (var iter = 0; iter < iterations; iter++) { 380 var pointShuffle = Enumerable.Range(0, N).Shuffle(random).ToArray(); 381 for (var p = 0; p < N; p++) { 382 var i = pointShuffle[p]; 383 var bmu = GetBestMatchingUnit(dissimilarities, alphas, i); 384 385 for (var k = 0; k < K; k++) { 386 for (var j = 0; j < N; j++) { 387 alphas[k][j] = oldAlphas[k][j] + learningRateT(iterations, iter) * neighborhood(iterations, iter, k, bmu) * ((i == j ? 1.0 : 0.0) - oldAlphas[k][j]); 388 } 389 } 390 } 391 for (var k = 0; k < K; k++) { 392 for (var j = 0; j < N; j++) { 393 oldAlphas[k][j] = alphas[k][j]; 394 } 395 } 396 } 397 398 var result = new DoubleMatrix(N, 2); 399 for (var i = 0; i < N; i++) { 400 var bmu = GetBestMatchingUnit(dissimilarities, alphas, i); 401 if (!jittering) { 402 result[i, 0] = getX(bmu); 403 result[i, 1] = getY(bmu); 404 } else { 405 result[i, 0] = getX(bmu) + random.NextDouble() * 0.8; 406 result[i, 1] = getY(bmu) + random.NextDouble() * 0.8; 407 } 408 } 409 return result; 410 } 411 412 private int GetBestMatchingUnit(DoubleMatrix D, double[][] alphas, int i) { 413 var bmu = -1; 414 var minV = double.MaxValue; 415 for (var k = 0; k < alphas.Length; k++) { 416 var Daki = 0.0; 417 var akDak = 0.0; 418 for (var r = 0; r < D.Rows; r++) { 419 var Dakr = 0.0; 420 for (var s = 0; s < D.Rows; s++) { 421 Dakr += D[r, s] * alphas[k][s]; 422 } 423 if (r == i) Daki = Dakr; 424 akDak += alphas[k][r] * Dakr; 425 } 426 var v = Daki - 0.5 * akDak; 427 if (v < minV) { 428 bmu = k; 429 minV = v; 430 } 431 } 432 return bmu; 433 } 434 #endregion 435 436 private DoubleMatrix Mds(DoubleMatrix dissimilarities) { 437 return MultidimensionalScaling.KruskalShepard(dissimilarities); 438 } 320 439 #endregion 321 440 }
Note: See TracChangeset
for help on using the changeset viewer.