/*Применение изменений, последовавших в ходе алгоритма Ктахилла-Макки*/ void applyCuthillMcKee(CommonData c, int[] newTopsNum) { List <int> l = newTopsNum.ToList <int>(); List <int[]> newConnMatrix = new List <int[]>(); int[] connString; for (int i = 0; i < c.NTotalNodes; i++) { connString = new int[c.NTotalNodes]; int oldTop = l[i]; connString[i] = 1; for (int j = 0; j < c.NTotalNodes; j++) { if ((oldTop != j) && (c.M[oldTop][j] == 1)) { connString[l.IndexOf(j)] = 1; } } newConnMatrix.Add(connString); } Point[] newCoord = new Point[c.NTotalNodes]; for (int i = 0; i < c.NTotalNodes; i++) { newCoord[i] = c.Coords[l[i]]; } int[] newBoundExternal = new int[c.NExternalNodes]; int k = 0; foreach (int i in c.BoundExternal) { newBoundExternal[k] = l.IndexOf(i); k++; } int[] newBoundInternal = new int[c.NInternalNodes]; k = 0; foreach (int i in c.BoundInternal) { newBoundInternal[k] = l.IndexOf(i); k++; } int[] newChangedPoints = new int[c.ChangedPoints.Length]; k = 0; foreach (int i in c.ChangedPoints) { newChangedPoints[k] = l.IndexOf(i); k++; } if (getBandWidthOfConnectivityMatrix(c.M) > getBandWidthOfConnectivityMatrix(newConnMatrix.ToArray())) { c.M = newConnMatrix.ToArray(); c.BoundExternal = newBoundExternal; c.BoundInternal = newBoundInternal; c.Coords = newCoord; c.SetChangedPoints(newChangedPoints, true); } }
private void button2_Click(object sender, EventArgs e) { cd.SetChangedPoints(changedPoints.ToArray(), false); Solver s = new Solver(); s.Solve(cd); pbMain.Refresh(); /* Создать Solver и вызывать Solver.Solve() */ /* Поменять CommmonData.Coords в соответствии с решением */ /* Вызвать DrawArea. Пока просто вызвать перерисовку pbMain.Refresh()*/ Solver solver = new Solver(); changedPoints = new List <int>(cd.ChangedPoints); double[] deltas = solver.Solve(cd); if (deltas != null) { int j; for (int i = 0; i < deltas.Length; i += 2) { j = i / 2; if (!changedPoints.Contains(j)) { cd.Coords[i / 2].Dx += deltas[i]; cd.Coords[i / 2].Dy += deltas[i + 1]; } } } pbMain.Refresh(); for (int i = 0; i < cd.NTotalNodes; i++) { cd.Coords[i].X += cd.Coords[i].Dx; cd.Coords[i].Y += cd.Coords[i].Dy; cd.Coords[i].Dx = 0; cd.Coords[i].Dy = 0; } changedPoints = new List <int>(); cd.ChangedPointsClear(); cd.SetChangedPoints(changedPoints.ToArray(), false); pbMain.Refresh(); }
/*Применение изменений, последовавших в ходе алгоритма Ктахилла-Макки*/ void applyCuthillMcKee(CommonData c, int[] newTopsNum) { List<int> l = newTopsNum.ToList<int>(); List<int[]> newConnMatrix = new List<int[]>(); int[] connString; for (int i = 0; i < c.NTotalNodes; i++) { connString = new int[c.NTotalNodes]; int oldTop = l[i]; connString[i] = 1; for (int j = 0; j < c.NTotalNodes; j++) { if ((oldTop != j) && (c.M[oldTop][j] == 1)) { connString[l.IndexOf(j)] = 1; } } newConnMatrix.Add(connString); } Point[] newCoord = new Point[c.NTotalNodes]; for(int i = 0; i < c.NTotalNodes; i++) { newCoord[i] = c.Coords[l[i]]; } int[] newBoundExternal = new int[c.NExternalNodes]; int k = 0; foreach (int i in c.BoundExternal) { newBoundExternal[k] = l.IndexOf(i); k++; } int[] newBoundInternal = new int[c.NInternalNodes]; k = 0; foreach (int i in c.BoundInternal) { newBoundInternal[k] = l.IndexOf(i); k++; } int[] newChangedPoints = new int[c.ChangedPoints.Length]; k = 0; foreach (int i in c.ChangedPoints) { newChangedPoints[k] = l.IndexOf(i); k++; } if (getBandWidthOfConnectivityMatrix(c.M)>getBandWidthOfConnectivityMatrix(newConnMatrix.ToArray())) { c.M = newConnMatrix.ToArray(); c.BoundExternal = newBoundExternal; c.BoundInternal = newBoundInternal; c.Coords = newCoord; c.SetChangedPoints(newChangedPoints, true); } }