ClusteringResult Run3() { OnReport("開始"); ClusteringResult cr = new ClusteringResult() { Parent = this }; cr.CreateRandom(ClusterTable, random.Next()); cr.Run(); OnReport("計算終了\n"); GC.Collect(); return cr; }
/// <summary> /// 過去のもの。頑張りすぎた。 /// </summary> /// <returns></returns> ClusteringResult Run2() { List<ClusteringResult> tmpResult = new List<ClusteringResult>(); OnReport("開始"); for (int i = 0; i < wideCount; i++) { ClusteringResult cr = new ClusteringResult() { Parent = this }; cr.CreateRandom(ClusterTable, random.Next()); tmpResult.Add(cr); } int loopCount = 0; int sameCount = 0; double sameRate = 0; while (true) { loopCount++; if (tmpResult.First().GetLockRate() == sameRate) { sameCount++; } else { sameRate = tmpResult.First().GetLockRate(); sameCount = 0; } OnReport(loopCount + "回目開始"); foreach (var item in tmpResult) { item.Run(); } OnReport("計算終了"); var baseResult = tmpResult.OrderByDescending(n => n.GetPerformanceIndex()).First(); foreach (var item in tmpResult) { item.CategorySort(baseResult); } tmpResult = tmpResult.OrderByDescending(n => n.GetPerformanceIndex()).ToList(); List<ClusteringResult> list = new List<ClusteringResult>(); foreach (var item in tmpResult.Take(tmpResult.Count / 2)) { var clone = item.Clone(); list.Add(clone); } if (tmpResult.Count > 3) { foreach (var item in tmpResult.Skip(tmpResult.Count / 2).ToArray()) { tmpResult.Remove(item); } foreach (var item in list) { tmpResult.Add(item.Clone()); } } if (tmpResult.First().GetLockRate() < 0.9 && loopCount < 100 && sameCount < 10) { int c = 0; OnReport("マージ・ランダム振り開始"); foreach (var item in tmpResult) { var count = item.CreateMargeData(list, true); // lock (this) { c += count; } } OnReport("レポート開始"); OnReport(tmpResult.First().View()); if (c == 0) break; } else { foreach (var item in tmpResult) { var count = item.CreateMargeData(list, false); } tmpResult.First().Run(); break; } if (tmpResult.First().DivideCategory()) { OnReport("クラスタ分割発生"); var r = tmpResult.First(); tmpResult.Clear(); for (int i = 0; i < TryCount; i++) { tmpResult.Add(r.Clone()); } } GC.Collect(); } GC.Collect(); OnReport("完了"); return tmpResult.First(); }