public bool IsFar(ZVector3d zVector, InitialCluster3d c) { double dif; for (int j = 0; j < c.ZVectors.Count; j++) { dif = Math.Abs(zVector.Num - c.ZVectors[j].Num); if (dif < dimension) { return false; } } return true; }
//For Vector3 public IReadOnlyList<InitialCluster3d> Clusterize(IReadOnlyList<ZVector3d> zVectors) { Prepare3(zVectors); double e = 0.000001; clusters.Add(new InitialCluster3d()); for (int i = 0; i < n; i++) { ZVector3d xi = x[i]; List<double> Ui = BuildU3(i);//Строим вершины графа //находим номера l классов, которые содержат точки, с которыми связана xi List<int> l = new List<int>(); for (int j = 0; j < Ui.Count; j++) { if (Ui[j] > e) //xi связанна с xj { int wxj = w3(x[j]); if (wxj != -1 && (!l.Contains(wxj)) && IsFar(xi, clusters[wxj])) { l.Add(wxj); } } } //(3.1) if (l.Count == 0) { clusters.Add(new InitialCluster3d(xi)); continue; } //(3.2) if (l.Count == 1) { if (clusters[l[0]].IsFormed) { clusters[0].Add(xi); } else { clusters[l[0]].Add(xi); } continue; } //(3.3) //проверяем сколько классов сформировано int tmp = 1; for (; tmp < clusters.Count; tmp++) { if (!clusters[tmp].IsFormed) { break; } } //(3.3.1) if (tmp == clusters.Count) //все классы сформированы { clusters[0].Add(xi); continue; } //(3.3.2) int zh = z3(l); l.Sort(); //a) if (zh > 1 || l[0] == 0) { clusters[0].Add(xi); for (int j = clusters.Count - 1; j >= 1; j--) { InitialCluster3d c = clusters[j]; if (Check3(c)) { c.IsFormed = true; } else { clusters[0].Add(c.ZVectors); clusters.Remove(c); } } } else //b) { for (int j = l.Count - 1; j > 0; j--) { clusters[l[0]].Add(clusters[l[j]].ZVectors); clusters.Remove(clusters[l[j]]); } clusters[l[0]].Add(xi); } } clusters.Remove(clusters[0]); //foreach (var cluster in clusters) //{ // cluster.SetCentr(); //} return clusters; }