public Claster JoinClasters(Claster cl1, Claster cl2) { List <MyObject> l1 = new List <MyObject>(); if (cl1 != null) { l1 = cl1.GetObjects(); } List <MyObject> l2 = cl2.GetObjects(); List <MyObject> l3 = new List <MyObject>(); if (cl1 != null) { foreach (var myObject in l1) { l3.Add(myObject); } } foreach (var myObject in l2) { l3.Add(myObject); } return(new Claster(l3)); }
}// количество объектов во всех кластерах /* public ArrayList RunForel(int numOfClaster, double Radius, Graphics graphic, ArrayList params1, ArrayList params2,int width, int height) * { * // ArrayList Res; * * Claster claster = ListOfClasters[numOfClaster]; * // Res = claster.sadasdsd(numOfClaster, Radius, graphic, params1, params2, width, height); * * return Res; * }*/ public Claster GetClasterForForel(int i) // дает кластер содержащий этот объект { int k = IsClasterOrSelected(i); Claster claster = ListOfClasters[k]; return(claster); }
public Claster GetNeighborhoods(MyObject obj) { NTree searchingTree = this; Claster result = null; while (searchingTree.claster.GetObjects().Count != 1) { foreach (var nTree in searchingTree.trees) { if (nTree.claster.GetObjects().IndexOf(obj) >= 0) { result = searchingTree.claster; searchingTree = nTree; break; } } } return(result); }
public void UpdateListOfClaster() // не все удаляет.. удаление одинаковых ветвей. { List <Claster> tmp_for_del = new List <Claster>(); List <Claster> tmp = new List <Claster>(); bool flag = true; int countOfclaster = list_of_claster.Count; for (int i = 0; i < countOfclaster; i++) { for (int j = i + 1; j < countOfclaster; j++) { foreach (var object1 in list_of_claster[i].GetObjects()) { foreach (var object2 in list_of_claster[j].GetObjects()) { if (object1 == object2 && list_of_claster[i] != list_of_claster[j]) { if (list_of_claster[i].GetObjects().Count < list_of_claster[j].GetObjects().Count) { //list_of_claster.Remove(claster1); if (flag) { tmp_for_del.Add(list_of_claster[j]); tmp.Add(list_of_claster[i]); flag = false; break; } } else { // list_of_claster.Remove(claster); if (flag) { tmp_for_del.Add(list_of_claster[i]); tmp.Add(list_of_claster[j]); flag = false; break; } } } } } flag = true; } } int counter = tmp.Count; for (int i = 0; i < counter; i++) { List <MyObject> list_Of_Obj = tmp_for_del[i].GetObjects(); List <MyObject> list_Of_Obj1 = tmp[i].GetObjects(); List <MyObject> new_list = new List <MyObject>(); foreach (var myObject in list_Of_Obj) { // list_Of_Obj.Remove(myObject); if (list_Of_Obj1.IndexOf(myObject) < 0) { new_list.Add(myObject); } } if (new_list.Count != 0) { Claster cl = new Claster(new_list); if (list_of_claster.IndexOf(cl) < 0) { list_of_claster.Add(new Claster(new_list)); } } list_of_claster.Remove(tmp_for_del[i]); } }
public NTree Do_Ierarhical_Clasterization() { int counter; while (trees.Count > 1) { counter = trees.Count; double[,] distance = new double[counter, counter]; double minDist = double.MaxValue; //!!!!!!!!!!!!!!!!!!!!!!!!! TODO error was here because int less than double int tmp = 0; for (int i = 0; i < counter; i++) { for (int j = i + 1; j < counter; j++) { if (i != j) { // MyObject obj1 = Claster.GetCenterOfMassInThisClaster(trees[i].claster.GetObjects()); //MyObject obj2 = Claster.GetCenterOfMassInThisClaster(trees[j].claster.GetObjects()); // distance[i, j] = Claster.GetDistanceFromObjectToCentroid(obj1, obj2); if (trees[j].claster != null && trees[i].claster != null) { distance[i, j] = trees[j].claster.GetAverangeIntergroupDistanceBetweenClasters( trees[i].claster.GetObjects(), trees[j].claster.GetObjects() ); } // теперь без самопересечений if (minDist > distance[i, j]) { minDist = distance[i, j]; tmp = i; } } } } Claster new_claster = null; NTree new_tree = null; int[] nums = new int[trees.Count]; // смотрим какие кластеры на этом шаге попали в объединение // for (int k = 0; k < counter; k++) // { int k = tmp; for (int j = k + 1; j < counter; j++) { if (minDist == distance[k, j]) { nums[k] = 1; nums[j] = 1; break; // для бинарности добавления } } // } new_tree = new NTree(minDist, new_claster); for (int i = 0; i < counter; i++) { if (nums[i] == 1) { new_claster = JoinClasters(new_claster, trees[i].claster); new_tree.trees.Add(trees[i]); } } ///// if (new_claster == null) { System.Windows.Forms.MessageBox.Show("axaxaxax!"); } ////// new_tree.claster = new_claster; for (int i = counter - 1; i >= 0; i--) { if (nums[i] == 1) { trees.Remove(trees[i]); } } if (new_tree != null && new_tree.claster != null) //на нуль проверку сделал { trees.Add(new_tree); } //// foreach (var tree in trees) { if (tree.claster == null) { System.Windows.Forms.MessageBox.Show("axaxaxax!"); } } ///// this.distance = minDist; } return(this); }
public bool is_in_big_claster = true; //показывает отделен ли потомок от единого кластера(было в одиночном удалении очень нужно) //end удаление вертикальных линий public NTree(double new_distance, Claster new_claster) { distance = new_distance; claster = new_claster; trees = new List <NTree>(); }
public void AddClaster(Color color) // Добавление кластера в список кластеров! { ClasterColor.Add(color); if (SelectedPoints.Count != 0)//если точек 0 то нельзя добавлять { List <MyObject> ObjectsOfClaster = new List <MyObject>(); #region // лично херной маюсь /* * SelectedPoints.Add(0); * SelectedPoints.Add(6); * SelectedPoints.Add(19); * SelectedPoints.Add(20); * SelectedPoints.Add(28); * SelectedPoints.Add(36); * SelectedPoints.Add(40); * SelectedPoints.Add(47); * SelectedPoints.Add(51); * * * * SelectedPoints.Add(3); * SelectedPoints.Add(3); * SelectedPoints.Add(3); * SelectedPoints.Add(3); * SelectedPoints.Add(3); * SelectedPoints.Add(3); * SelectedPoints.Add(3); * SelectedPoints.Add(3); * SelectedPoints.Add(3); * SelectedPoints.Add(3); * SelectedPoints.Add(3); * SelectedPoints.Add(3); */ #endregion foreach (var point in SelectedPoints) { ObjectsOfClaster.Add(GiveObject(Int32.Parse(point.ToString()))); } Claster claster = new Claster(ObjectsOfClaster); ListOfClasters.Add(claster); SelectedPointsByClasters.Add(SelectedPoints); SelectedPoints = new ArrayList(); // clear делать нельзя, потому что добавили в список кластеров. иначе там очистятся тоже } int counter = arrayOfClasterAndSelectedPoints.Count(); int numer = ListOfClasters.Count - 1; for (int i = 0; i < counter; i++) { if (arrayOfClasterAndSelectedPoints[i] == -1) { arrayOfClasterAndSelectedPoints[i] = numer; } } }
public void RunForel(int numOfClaster, int firstElement, Claster myClaster, double radius) { double[] radInProection = myClaster.GetDiametrInProection(numRow, numCol); // две удаленные точки и диаметр .. всего 3 элемента в массиве List <ArrayList> listOfPoints = controller.GetListOfClasterPoints(); ArrayList arrayList = listOfPoints[numOfClaster]; //две выделенные точки int point1 = int.Parse(arrayList[(int)radInProection[0]].ToString()); int point2 = int.Parse(arrayList[(int)radInProection[1]].ToString()); // ////////////////////////////////////////////////////////// painting int count = params1.Count; double max1 = double.Parse(params1[0].ToString()); double min1 = double.Parse(params1[0].ToString()); double max2 = double.Parse(params2[0].ToString()); double min2 = double.Parse(params2[0].ToString()); for (int i = 0; i <= count - 1; i++) // ищем максимумы и минимумы { if (double.Parse(params1[i].ToString()) > max1) { max1 = double.Parse(params1[i].ToString()); } if (double.Parse(params1[i].ToString()) < min1) { min1 = double.Parse(params1[i].ToString()); } if (double.Parse(params2[i].ToString()) > max2) { max2 = double.Parse(params2[i].ToString()); } if (double.Parse(params2[i].ToString()) < min2) { min2 = double.Parse(params2[i].ToString()); } } var step1 = ((max1 - min1) / (width * 0.7)); var step1ForRad = ((width * 0.7) * (double.Parse(params1[point1].ToString()) - min1) / (max1 - min1)); var step2 = ((max2 - min2) / (height * 0.7)); var step2ForRad = ((height * 0.7) * (double.Parse(params2[point2].ToString()) - min2) / (max2 - min2)); //////////////////////////////////////////////////////////////// painting List <MyObject> objects = myClaster.GetObjects(); int countObj = objects.Count; int countAtr = objects[0].attrib.Count; double[,] vectX = new double[countObj, countAtr]; for (int i = 0; i < countObj; i++) { for (int j = 0; j < countAtr; j++) { vectX[i, j] = double.Parse(objects[i].attrib[j].ToString()); } } double[] xCenter = new double[countAtr]; // заполняем начальный центр масс. for (int j = 0; j < countAtr; j++) { xCenter[j] = vectX[firstElement, j]; } Boolean flagForCycle = true; ArrayList ObjInSphere = new ArrayList(); for (int i = 0; i < countObj; i++) { ObjInSphere.Add(i); } int m = 0; // tmp counter ///////////////////............. while (flagForCycle) { int num = ObjInSphere.Count; int[] numOfObjects = new int[num]; ObjInSphere.CopyTo(numOfObjects); ObjInSphere.Clear(); double[] ArrayX = new double[countAtr]; // какой то объект int myCountObjectsInSphere = 0; for (int i = 0; i < num; i++) { for (int j = 0; j < countAtr; j++) { ArrayX[j] = vectX[i, j]; //////////////////// } double length = myClaster.GetRo(ArrayX, xCenter); if (length <= radius / 2) { myCountObjectsInSphere++; ObjInSphere.Add(i); } } double[] xNewCenter = new double[countAtr]; // новый центр масс. foreach (var nums in ObjInSphere) { m = Int32.Parse(nums.ToString()); for (int j = 0; j < countAtr; j++) { xNewCenter[j] += vectX[m, j] / ObjInSphere.Count; } } graph.Clear(Color.White); RedrawMe(); graph.FillEllipse(Brushes.LightPink, (float)(width * 0.05 + (xNewCenter[numRow] - min1) / step1), (float)(height * 0.9 - (xNewCenter[numCol] - min2) / step2), 9, 9); graph.DrawEllipse(Pens.LightSkyBlue, (float)(width * 0.05 - step1ForRad / 2 + (xNewCenter[numRow] - min1) / step1), (float)(height * 0.9 - step2ForRad / 2 - (xNewCenter[numCol] - min2) / step2), (float)(step1ForRad), (float)(step2ForRad)); // отмечаем новый цм // рисуем круг радиусом соответствующим bool flag = false; for (int i = 0; i < countAtr; i++) { if (xNewCenter[i] != xCenter[i]) { flag = true; } } flagForCycle = flag; if (flagForCycle) { xCenter = xNewCenter; } } string res = null; for (int i = 0; i < ObjInSphere.Count; i++) { res += ObjInSphere[i].ToString() + "\n"; } MessageBox.Show(res); }