Changeset 13713 for branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystemView.cs
- Timestamp:
- 03/17/16 00:29:30 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystemView.cs
r13668 r13713 1 1 #region License Information 2 2 /* HeuristicLab 3 * Copyright (C) 2002-201 2Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 * 5 5 * This file is part of HeuristicLab. … … 22 22 using HeuristicLab.Analysis; 23 23 using HeuristicLab.Analysis.QualityAnalysis; 24 using HeuristicLab.Clients.OKB.RunCreation; 24 25 using HeuristicLab.Common; 25 26 using HeuristicLab.Common.Resources; 27 using HeuristicLab.Core; 26 28 using HeuristicLab.Core.Views; 27 29 using HeuristicLab.Data; 30 using HeuristicLab.Data.Views; 28 31 using HeuristicLab.MainForm; 29 32 using HeuristicLab.Optimization; … … 37 40 using System.Windows.Forms; 38 41 using System.Windows.Forms.DataVisualization.Charting; 42 using DoubleValue = HeuristicLab.Data.DoubleValue; 39 43 40 44 namespace HeuristicLab.OptimizationExpertSystem { … … 42 46 [Content(typeof(ExpertSystem), IsDefaultView = true)] 43 47 public partial class ExpertSystemView : NamedItemView { 44 protected TypeSelectorDialog problemTypeSelectorDialog; 48 private EnumValueView<SeedingStrategyTypes> seedingStrategyView; 49 private CheckedItemListView<IScope> seedingSolutionsView; 45 50 protected virtual bool SuppressEvents { get; set; } 46 51 private bool okbDownloadInProgress; … … 61 66 refreshMapButton.Text = string.Empty; 62 67 refreshMapButton.Image = VSImageLibrary.Refresh; 63 } 64 65 protected override void Dispose(bool disposing) { 66 if (disposing) { 67 if (problemTypeSelectorDialog != null) problemTypeSelectorDialog.Dispose(); 68 if (components != null) components.Dispose(); 69 } 70 base.Dispose(disposing); 71 } 72 68 seedingStrategyView = new EnumValueView<SeedingStrategyTypes>() { 69 Dock = DockStyle.Fill 70 }; 71 seedingSolutionsView = new CheckedItemListView<IScope>() { 72 Dock = DockStyle.Fill 73 }; 74 solutionsSeedingTableLayoutPanel.SuspendLayout(); 75 solutionsSeedingTableLayoutPanel.Controls.Add(seedingStrategyView, 0, 0); 76 solutionsSeedingTableLayoutPanel.Controls.Add(seedingSolutionsView, 0, 1); 77 solutionsSeedingTableLayoutPanel.ResumeLayout(true); 78 } 79 80 #region Event Registration 73 81 protected override void DeregisterContentEvents() { 74 82 Content.PropertyChanged -= ContentOnPropertyChanged; … … 78 86 Content.SuggestedInstances.ItemsRemoved -= SuggestedInstancesOnChanged; 79 87 Content.SuggestedInstances.ItemsReplaced -= SuggestedInstancesOnChanged; 80 Content.SolutionPool.ItemsAdded -= SolutionPoolOnChanged; 81 Content.SolutionPool.ItemsRemoved -= SolutionPoolOnChanged; 82 Content.SolutionPool.ItemsReplaced -= SolutionPoolOnChanged; 83 Content.SolutionPool.CollectionReset -= SolutionPoolOnChanged; 84 if (Content.Problem != null) Content.Problem.ProblemChanged -= ContentOnProblemChanged; 88 DeregisterProblemEvents(Content.Problem); 85 89 base.DeregisterContentEvents(); 86 90 } 91 87 92 protected override void RegisterContentEvents() { 88 93 base.RegisterContentEvents(); … … 93 98 Content.SuggestedInstances.ItemsRemoved += SuggestedInstancesOnChanged; 94 99 Content.SuggestedInstances.ItemsReplaced += SuggestedInstancesOnChanged; 95 Content.SolutionPool.ItemsAdded += SolutionPoolOnChanged; 96 Content.SolutionPool.ItemsRemoved += SolutionPoolOnChanged; 97 Content.SolutionPool.ItemsReplaced += SolutionPoolOnChanged; 98 Content.SolutionPool.CollectionReset += SolutionPoolOnChanged; 99 if (Content.Problem != null) Content.Problem.ProblemChanged += ContentOnProblemChanged; 100 } 100 RegisterProblemEvents(Content.Problem); 101 } 102 103 private void DeregisterProblemEvents(OKBProblem problem) { 104 if (problem == null) return; 105 problem.Solutions.ItemsAdded -= SolutionsOnChanged; 106 problem.Solutions.ItemsRemoved -= SolutionsOnChanged; 107 problem.Solutions.ItemsReplaced -= SolutionsOnChanged; 108 problem.Solutions.CollectionReset -= SolutionsOnChanged; 109 problem.ProblemChanged -= ContentOnProblemChanged; 110 } 111 112 private void RegisterProblemEvents(OKBProblem problem) { 113 if (problem == null) return; 114 problem.Solutions.ItemsAdded += SolutionsOnChanged; 115 problem.Solutions.ItemsRemoved += SolutionsOnChanged; 116 problem.Solutions.ItemsReplaced += SolutionsOnChanged; 117 problem.Solutions.CollectionReset += SolutionsOnChanged; 118 problem.ProblemChanged += ContentOnProblemChanged; 119 } 120 #endregion 101 121 102 122 protected override void OnContentChanged() { … … 107 127 if (Content == null) { 108 128 maxEvaluationsTextBox.Text = String.Empty; 109 110 129 problemViewHost.Content = null; 111 algorithmViewHost.Content = null; 130 solverParametersView.Content = null; 131 solverResultsView.Content = null; 112 132 runsView.Content = null; 113 solutionsViewHost.Content = null;114 133 kbViewHost.Content = null; 115 134 problemInstancesView.Content = null; 135 seedingStrategyView.Content = null; 136 seedingSolutionsView.Content = null; 116 137 } else { 117 138 maxEvaluationsTextBox.Text = Content.MaximumEvaluations.ToString(); 118 139 problemViewHost.Content = Content.Problem; 119 140 runsView.Content = Content.Runs; 120 solutionsViewHost.Content = Content.SolutionPool;121 141 kbViewHost.ViewType = typeof(RunCollectionRLDView); 122 142 kbViewHost.Content = Content.KnowledgeBase; 123 143 problemInstancesView.Content = Content.ProblemInstances; 124 algorithmViewHost.Content = Content.CurrentResult; 144 solverResultsView.Content = Content.CurrentResult; 145 seedingStrategyView.Content = Content.SeedingStrategy; 146 seedingSolutionsView.Content = Content.SolutionSeedingPool; 125 147 } 126 148 } finally { SuppressEvents = false; } 127 149 UpdateSuggestedInstancesCombobox(); 150 UpdateSimilarityCalculators(); 128 151 UpdateNamesComboboxes(); 129 UpdateSimilarityCalculators();130 152 } 131 153 … … 137 159 algorithmStartButton.Enabled = Content != null && !ReadOnly && !Locked && suggestedInstancesComboBox.SelectedIndex >= 0; 138 160 algorithmCloneButton.Enabled = Content != null && !ReadOnly && !Locked && suggestedInstancesComboBox.SelectedIndex >= 0; 139 algorithmViewHost.Enabled = Content != null && !ReadOnly && !Locked;140 161 runsView.Enabled = Content != null; 141 162 kbViewHost.Enabled = Content != null && !okbDownloadInProgress; … … 143 164 refreshMapButton.Enabled = Content != null; 144 165 okbDownloadButton.Enabled = Content != null && Content.Problem != null && Content.Problem.ProblemId >= 0 && !ReadOnly && !Locked && !okbDownloadInProgress; 145 }146 147 private void UpdateSuggestedInstancesCombobox() {148 var prevSelection = (IAlgorithm)suggestedInstancesComboBox.SelectedItem;149 var prevNewIndex = -1;150 suggestedInstancesComboBox.Items.Clear();151 if (Content == null) return;152 153 for (var i = 0; i < Content.SuggestedInstances.Count; i++) {154 suggestedInstancesComboBox.Items.Add(Content.SuggestedInstances[i]);155 if (prevSelection == null || Content.SuggestedInstances[i].Name == prevSelection.Name)156 prevNewIndex = prevSelection == null ? 0 : i;157 }158 if (prevNewIndex >= 0) {159 suggestedInstancesComboBox.SelectedIndex = prevNewIndex;160 }161 }162 163 private void UpdateNamesComboboxes() {164 var selectedSolutionName = solutionNameComboBox.SelectedIndex >= 0 ? (string)solutionNameComboBox.SelectedItem : string.Empty;165 var selectedQualityName = qualityNameComboBox.SelectedIndex >= 0 ? (string)qualityNameComboBox.SelectedItem : string.Empty;166 167 solutionNameComboBox.Items.Clear();168 qualityNameComboBox.Items.Clear();169 if (Content == null) return;170 var qualityNames = new HashSet<string>(Content.SolutionPool.SelectMany(x => x.Variables).Where(x => x.Value is DoubleValue).Select(x => x.Name));171 var solutionNames = Content.SolutionPool.SelectMany(x => x.Variables).Where(x => !qualityNames.Contains(x.Name));172 173 foreach (var sn in solutionNames.GroupBy(x => x.Name).OrderBy(x => x.Key)) {174 solutionNameComboBox.Items.Add(sn.Key);175 // either it was previously selected, or the variable value is defined in the HeuristicLab.Encodings sub-namespace176 if (sn.Key == selectedSolutionName || (string.IsNullOrEmpty(selectedSolutionName) && sn.All(x => x.Value != null && x.Value.GetType().FullName.StartsWith("HeuristicLab.Encodings."))))177 solutionNameComboBox.SelectedItem = sn.Key;178 }179 foreach (var qn in qualityNames.OrderBy(x => x)) {180 qualityNameComboBox.Items.Add(qn);181 if (qn == selectedQualityName || string.IsNullOrEmpty(selectedQualityName)) qualityNameComboBox.SelectedItem = qn;182 }183 }184 185 private void UpdateSimilarityCalculators() {186 var selected = (ISolutionSimilarityCalculator)(similarityComboBox.SelectedIndex >= 0 ? similarityComboBox.SelectedItem : null);187 similarityComboBox.Items.Clear();188 189 if (Content == null || Content.Problem == null) return;190 191 foreach (var calc in Content.Problem.Operators.OfType<ISolutionSimilarityCalculator>()) {192 similarityComboBox.Items.Add(calc);193 if (selected != null && calc.ItemName == selected.ItemName) similarityComboBox.SelectedItem = calc;194 }195 if (selected == null && similarityComboBox.Items.Count > 0)196 similarityComboBox.SelectedIndex = 0;197 166 } 198 167 … … 216 185 case "MaximumEvaluations": maxEvaluationsTextBox.Text = Content.MaximumEvaluations.ToString(); break; 217 186 case "Problem": 187 DeregisterProblemEvents(problemViewHost.Content as OKBProblem); 218 188 problemViewHost.Content = Content.Problem; 219 Content.Problem.ProblemChanged += ContentOnProblemChanged; 189 RegisterProblemEvents(Content.Problem); 190 UpdateNamesComboboxes(); 220 191 break; 221 192 case "ProblemInstances": problemInstancesView.Content = Content.ProblemInstances; break; 222 case "CurrentResult": algorithmViewHost.Content = Content.CurrentResult; break;193 case "CurrentResult": solverResultsView.Content = Content.CurrentResult; break; 223 194 } 224 195 } finally { SuppressEvents = false; } … … 230 201 } 231 202 232 private void Solution PoolOnChanged(object sender, EventArgs e) {203 private void SolutionsOnChanged(object sender, EventArgs e) { 233 204 UpdateNamesComboboxes(); 234 if (qualityNameComboBox.SelectedIndex >= 0) { 235 var qualityName = (string)qualityNameComboBox.SelectedItem; 236 UpdateSolutionQualityAnalysis(qualityName); 237 } 238 if (similarityComboBox.SelectedIndex >= 0) { 239 var calculator = (ISolutionSimilarityCalculator)similarityComboBox.SelectedItem; 240 UpdateSolutionDiversityAnalysis(calculator); 241 UpdateSolutionFdcAnalysis(calculator); 242 UpdateSolutionLengthScaleAnalysis(calculator); 243 UpdateSolutionNetworkAnalysis(calculator); 244 } else solutionsDiversityViewHost.Content = null; 205 UpdateSolutionVisualization(); 245 206 } 246 207 #endregion … … 263 224 } 264 225 } 265 #endregion266 #endregion267 226 268 227 private void RefreshMapButtonOnClick(object sender, EventArgs e) { 269 228 Content.UpdateInstanceProjection(); 270 229 UpdateProjectionComboBox(); 271 }272 273 private void UpdateProjectionComboBox() {274 projectionComboBox.Items.Clear();275 var projStrings = Content.ProblemInstances276 .SelectMany(x => x.Results.Where(y => Regex.IsMatch(y.Key, "^Projection[.].*[.][XY]$")))277 .Select(x => Regex.Match(x.Key, "Projection[.](?<g>.*)[.][XY]").Groups["g"].Value)278 .Distinct();279 foreach (var str in projStrings) {280 projectionComboBox.Items.Add(str);281 }282 230 } 283 231 … … 295 243 } 296 244 297 private void OkbDownloadProgressOnStateChanged(object sender, EventArgs eventArgs) { 245 private void OkbDownloadProgressOnStateChanged(object sender, EventArgs e) { 246 if (InvokeRequired) { Invoke((Action<object, EventArgs>)OkbDownloadProgressOnStateChanged, sender, e); return; } 298 247 var progress = (IProgress)sender; 299 248 okbDownloadInProgress = progress.ProgressState == ProgressState.Started; … … 316 265 317 266 private void ProjectionComboBoxOnSelectedIndexChanged(object sender, EventArgs e) { 267 if (InvokeRequired) { Invoke((Action<object, EventArgs>)ProjectionComboBoxOnSelectedIndexChanged, sender, e); return; } 318 268 if (projectionComboBox.SelectedIndex < 0) return; 319 269 var projection = (string)projectionComboBox.SelectedItem; … … 346 296 } 347 297 298 private void SuggestedInstancesComboBoxOnSelectedIndexChanged(object sender, EventArgs e) { 299 if (InvokeRequired) { Invoke((Action<object, EventArgs>)SuggestedInstancesComboBoxOnSelectedIndexChanged, sender, e); return; } 300 if (suggestedInstancesComboBox.SelectedIndex >= 0) { 301 solverParametersView.Content = Content.SuggestedInstances[suggestedInstancesComboBox.SelectedIndex].Parameters; 302 } else solverParametersView.Content = null; 303 SetEnabledStateOfControls(); 304 } 305 306 private void SimilarityComboBoxOnSelectedIndexChanged(object sender, EventArgs e) { 307 if (InvokeRequired) { Invoke((Action<object, EventArgs>)SimilarityComboBoxOnSelectedIndexChanged, sender, e); return; } 308 var calculator = (ISolutionSimilarityCalculator)similarityComboBox.SelectedItem; 309 if (calculator != null) { 310 calculator.SolutionVariableName = (string)solutionNameComboBox.SelectedItem; 311 calculator.QualityVariableName = Content.Problem.Problem.Evaluator.QualityParameter.ActualName; 312 } 313 UpdateSolutionDiversityAnalysis(calculator); 314 UpdateSolutionFdcAnalysis(calculator); 315 UpdateSolutionLengthScaleAnalysis(calculator); 316 UpdateSolutionNetworkAnalysis(calculator); 317 } 318 #endregion 319 #endregion 320 321 #region Control Configuration 322 private void UpdateSuggestedInstancesCombobox() { 323 var prevSelection = (IAlgorithm)suggestedInstancesComboBox.SelectedItem; 324 var prevNewIndex = -1; 325 suggestedInstancesComboBox.Items.Clear(); 326 if (Content == null) return; 327 328 for (var i = 0; i < Content.SuggestedInstances.Count; i++) { 329 suggestedInstancesComboBox.Items.Add(Content.SuggestedInstances[i]); 330 if (prevSelection == null || Content.SuggestedInstances[i].Name == prevSelection.Name) 331 prevNewIndex = prevSelection == null ? 0 : i; 332 } 333 if (prevNewIndex >= 0) { 334 suggestedInstancesComboBox.SelectedIndex = prevNewIndex; 335 } 336 } 337 338 private void UpdateSimilarityCalculators() { 339 var selected = (ISolutionSimilarityCalculator)(similarityComboBox.SelectedIndex >= 0 ? similarityComboBox.SelectedItem : null); 340 similarityComboBox.Items.Clear(); 341 342 if (Content == null || Content.Problem == null) return; 343 344 foreach (var calc in Content.Problem.Operators.OfType<ISolutionSimilarityCalculator>()) { 345 similarityComboBox.Items.Add(calc); 346 if (selected != null && calc.ItemName == selected.ItemName) similarityComboBox.SelectedItem = calc; 347 } 348 if (selected == null && similarityComboBox.Items.Count > 0) 349 similarityComboBox.SelectedIndex = 0; 350 } 351 352 private void UpdateNamesComboboxes() { 353 var selectedSolutionName = solutionNameComboBox.SelectedIndex >= 0 ? (string)solutionNameComboBox.SelectedItem : string.Empty; 354 355 solutionNameComboBox.Items.Clear(); 356 if (Content == null) return; 357 var solutionNames = Content.Problem.Solutions.Select(x => x.Solution).OfType<IScope>().SelectMany(x => x.Variables); 358 359 foreach (var sn in solutionNames.GroupBy(x => x.Name).OrderBy(x => x.Key)) { 360 solutionNameComboBox.Items.Add(sn.Key); 361 // either it was previously selected, or the variable value is defined in the HeuristicLab.Encodings sub-namespace 362 if (sn.Key == selectedSolutionName || (string.IsNullOrEmpty(selectedSolutionName) && sn.All(x => x.Value != null && x.Value.GetType().FullName.StartsWith("HeuristicLab.Encodings.")))) 363 solutionNameComboBox.SelectedItem = sn.Key; 364 } 365 } 366 367 private void UpdateProjectionComboBox() { 368 projectionComboBox.Items.Clear(); 369 var projStrings = Content.ProblemInstances 370 .SelectMany(x => x.Results.Where(y => Regex.IsMatch(y.Key, "^Projection[.].*[.][XY]$"))) 371 .Select(x => Regex.Match(x.Key, "Projection[.](?<g>.*)[.][XY]").Groups["g"].Value) 372 .Distinct(); 373 foreach (var str in projStrings) { 374 projectionComboBox.Items.Add(str); 375 } 376 } 377 #endregion 378 379 #region Visualization 380 #region Solution Visualization 381 public void UpdateSolutionVisualization() { 382 if (InvokeRequired) { Invoke((Action)UpdateSolutionVisualization); return; } 383 var qualityName = Content.Problem.Problem.Evaluator.QualityParameter.ActualName; 384 UpdateSolutionQualityAnalysis(qualityName); 385 if (similarityComboBox.SelectedIndex >= 0) { 386 var calculator = (ISolutionSimilarityCalculator)similarityComboBox.SelectedItem; 387 UpdateSolutionDiversityAnalysis(calculator); 388 UpdateSolutionFdcAnalysis(calculator); 389 UpdateSolutionLengthScaleAnalysis(calculator); 390 UpdateSolutionNetworkAnalysis(calculator); 391 } else { 392 solutionsDiversityViewHost.Content = null; 393 solutionsFdcViewHost.Content = null; 394 solutionsLengthScaleViewHost.Content = null; 395 solutionsNetworkChart.Series.First().Points.Clear(); 396 } 397 } 348 398 private void UpdateSolutionQualityAnalysis(string qualityName) { 349 399 var dt = solutionsQualityViewHost.Content as DataTable; 350 400 if (dt == null) { 351 401 dt = QualityDistributionAnalyzer.PrepareTable(qualityName); 402 dt.VisualProperties.Title = "Quality Distribution"; 352 403 solutionsQualityViewHost.Content = dt; 353 404 } 354 QualityDistributionAnalyzer.UpdateTable(dt, Content. SolutionPool.Where(x => x.Variables.ContainsKey(qualityName)).Select(x => x.Variables[qualityName].Value).OfType<DoubleValue>().Select(x => x.Value));405 QualityDistributionAnalyzer.UpdateTable(dt, Content.Problem.Solutions.Select(x => x.Solution).OfType<IScope>().Where(x => x.Variables.ContainsKey(qualityName)).Select(x => x.Variables[qualityName].Value).OfType<DoubleValue>().Select(x => x.Value)); 355 406 } 356 407 … … 358 409 try { 359 410 solutionsDiversityViewHost.Content = null; 360 if (Content.SolutionPool == null) return; 361 var similarities = new double[Content.SolutionPool.Count, Content.SolutionPool.Count]; 362 for (int i = 0; i < Content.SolutionPool.Count; i++) { 363 for (int j = 0; j < Content.SolutionPool.Count; j++) 364 similarities[i, j] = calculator.CalculateSolutionSimilarity(Content.SolutionPool[i], Content.SolutionPool[j]); 411 var similarities = new double[Content.Problem.Solutions.Count, Content.Problem.Solutions.Count]; 412 for (int i = 0; i < Content.Problem.Solutions.Count; i++) { 413 for (int j = 0; j < Content.Problem.Solutions.Count; j++) 414 similarities[i, j] = calculator.CalculateSolutionSimilarity((IScope)Content.Problem.Solutions[i].Solution, (IScope)Content.Problem.Solutions[j].Solution); 365 415 } 366 416 var hm = new HeatMap(similarities, "Solution Similarities", 0.0, 1.0); … … 372 422 try { 373 423 solutionsFdcViewHost.Content = null; 374 if (Content.SolutionPool == null) return;375 424 var points = new List<Point2D<double>>(); 376 for (int i = 0; i < Content. SolutionPool.Count; i++) {377 for (int j = 0; j < Content. SolutionPool.Count; j++) {425 for (int i = 0; i < Content.Problem.Solutions.Count; i++) { 426 for (int j = 0; j < Content.Problem.Solutions.Count; j++) { 378 427 if (i == j) continue; 379 var qDiff = Math.Abs(((DoubleValue)Content.SolutionPool[i].Variables[calculator.QualityVariableName].Value).Value - ((DoubleValue)Content.SolutionPool[j].Variables[calculator.QualityVariableName].Value).Value); 380 points.Add(new Point2D<double>(qDiff, 1.0 - calculator.CalculateSolutionSimilarity(Content.SolutionPool[i], Content.SolutionPool[j]))); 428 var qDiff = Math.Abs(((DoubleValue)((IScope)Content.Problem.Solutions[i].Solution).Variables[calculator.QualityVariableName].Value).Value 429 - ((DoubleValue)((IScope)Content.Problem.Solutions[j].Solution).Variables[calculator.QualityVariableName].Value).Value); 430 points.Add(new Point2D<double>(qDiff, 1.0 - calculator.CalculateSolutionSimilarity((IScope)Content.Problem.Solutions[i].Solution, (IScope)Content.Problem.Solutions[j].Solution))); 381 431 } 382 432 } 383 433 var splot = new ScatterPlot("Fitness-Distance", ""); 434 splot.VisualProperties.XAxisTitle = "Absolute Fitness Difference"; 435 splot.VisualProperties.XAxisMinimumFixedValue = 0.0; 436 splot.VisualProperties.YAxisTitle = "Solution Distance"; 437 splot.VisualProperties.YAxisMinimumFixedValue = 0.0; 438 splot.VisualProperties.YAxisMaximumFixedValue = 1.0; 384 439 var row = new ScatterPlotDataRow("Fdc", "", points); 385 440 row.VisualProperties.PointSize = 7; … … 392 447 try { 393 448 solutionsLengthScaleViewHost.Content = null; 394 if (Content.SolutionPool == null) return;395 449 var dt = solutionsLengthScaleViewHost.Content as DataTable; 396 450 if (dt == null) { … … 404 458 405 459 private IEnumerable<double> CalculateLengthScale(ISolutionSimilarityCalculator calculator) { 406 for (int i = 0; i < Content. SolutionPool.Count; i++) {407 for (int j = 0; j < Content. SolutionPool.Count; j++) {460 for (int i = 0; i < Content.Problem.Solutions.Count; i++) { 461 for (int j = 0; j < Content.Problem.Solutions.Count; j++) { 408 462 if (i == j) continue; 409 var sim = calculator.CalculateSolutionSimilarity( Content.SolutionPool[i], Content.SolutionPool[j]);463 var sim = calculator.CalculateSolutionSimilarity((IScope)Content.Problem.Solutions[i].Solution, (IScope)Content.Problem.Solutions[j].Solution); 410 464 if (sim.IsAlmost(0)) continue; 411 var qDiff = Math.Abs(((DoubleValue)Content.SolutionPool[i].Variables[calculator.QualityVariableName].Value).Value - ((DoubleValue)Content.SolutionPool[j].Variables[calculator.QualityVariableName].Value).Value); 465 var qDiff = Math.Abs(((DoubleValue)((IScope)Content.Problem.Solutions[i].Solution).Variables[calculator.QualityVariableName].Value).Value 466 - ((DoubleValue)((IScope)Content.Problem.Solutions[j].Solution).Variables[calculator.QualityVariableName].Value).Value); 412 467 yield return qDiff / sim; 413 468 } … … 419 474 var series = solutionsNetworkChart.Series["SolutionSeries"]; 420 475 series.Points.Clear(); 421 var dissimilarities = new DoubleMatrix(Content. SolutionPool.Count, Content.SolutionPool.Count);422 for (int i = 0; i < Content. SolutionPool.Count; i++) {423 for (int j = 0; j < Content. SolutionPool.Count; j++) {476 var dissimilarities = new DoubleMatrix(Content.Problem.Solutions.Count, Content.Problem.Solutions.Count); 477 for (int i = 0; i < Content.Problem.Solutions.Count; i++) { 478 for (int j = 0; j < Content.Problem.Solutions.Count; j++) { 424 479 if (i == j) continue; 425 dissimilarities[i, j] = 1.0 - calculator.CalculateSolutionSimilarity( Content.SolutionPool[i], Content.SolutionPool[j]);480 dissimilarities[i, j] = 1.0 - calculator.CalculateSolutionSimilarity((IScope)Content.Problem.Solutions[i].Solution, (IScope)Content.Problem.Solutions[j].Solution); 426 481 } 427 482 } 428 483 var coords = MultidimensionalScaling.KruskalShepard(dissimilarities); 429 484 for (var i = 0; i < coords.Rows; i++) { 430 var quality = ((DoubleValue) Content.SolutionPool[i].Variables[calculator.QualityVariableName].Value).Value;485 var quality = ((DoubleValue)((IScope)Content.Problem.Solutions[i].Solution).Variables[calculator.QualityVariableName].Value).Value; 431 486 series.Points.Add(new DataPoint() { 432 Name = i.ToString(),487 Name = (i + 1).ToString(), 433 488 XValue = coords[i, 0], 434 489 YValues = new[] { coords[i, 1], quality }, … … 438 493 } catch { } 439 494 } 440 441 private void SuggestedInstancesComboBoxOnSelectedIndexChanged(object sender, EventArgs e) { 442 SetEnabledStateOfControls(); 443 } 444 445 private void qualityNameComboBox_SelectedIndexChanged(object sender, EventArgs e) { 446 if (qualityNameComboBox.SelectedIndex < 0) return; 447 solutionsQualityViewHost.Content = null; 448 solutionsDiversityViewHost.Content = null; 449 var qualityName = (string)qualityNameComboBox.SelectedItem; 450 UpdateSolutionQualityAnalysis(qualityName); 451 var calculator = (ISolutionSimilarityCalculator)similarityComboBox.SelectedItem; 452 if (calculator != null) calculator.QualityVariableName = qualityName; 453 UpdateSolutionDiversityAnalysis(calculator); 454 UpdateSolutionFdcAnalysis(calculator); 455 UpdateSolutionLengthScaleAnalysis(calculator); 456 UpdateSolutionNetworkAnalysis(calculator); 457 } 458 459 private void solutionNameComboBox_SelectedIndexChanged(object sender, EventArgs e) { 460 var calculator = (ISolutionSimilarityCalculator)similarityComboBox.SelectedItem; 461 if (calculator != null) calculator.SolutionVariableName = (string)solutionNameComboBox.SelectedItem; 462 UpdateSolutionDiversityAnalysis(calculator); 463 UpdateSolutionFdcAnalysis(calculator); 464 UpdateSolutionLengthScaleAnalysis(calculator); 465 UpdateSolutionNetworkAnalysis(calculator); 466 } 467 468 private void similarityComboBox_SelectedIndexChanged(object sender, EventArgs e) { 469 var calculator = (ISolutionSimilarityCalculator)similarityComboBox.SelectedItem; 470 if (calculator != null) { 471 calculator.SolutionVariableName = (string)solutionNameComboBox.SelectedItem; 472 calculator.QualityVariableName = (string)qualityNameComboBox.SelectedItem; 473 } 474 UpdateSolutionDiversityAnalysis(calculator); 475 UpdateSolutionFdcAnalysis(calculator); 476 UpdateSolutionLengthScaleAnalysis(calculator); 477 UpdateSolutionNetworkAnalysis(calculator); 478 } 495 #endregion 496 #endregion 479 497 } 480 498 }
Note: See TracChangeset
for help on using the changeset viewer.