private void BreadthFirstSearch() { //1. Поместить все узлы из множества So в список OPEN. lOpen.Add(startPos); traversed = false; while (!traversed) { //Log(string.Format("Open: {0}, closed: {1}.", lOpen.Count, lClosed.Count)); if (lOpen.Count == 0) { traversed = true; break; } if (lOpen[0].Region == 4) { GeneratePath(); Animate(); TestPath(path); } if (lOpen[0].Region <= 3) // можно раскрыть { //4. Раскрыть вершину n и все порождённые вершины поместить в список OPEN настроив указатели к вершине n for (int i = 0; i < chkpntList[lOpen[0].Region + 1 - 1].Count; i++) { Point3dNode t = new Point3dNode(chkpntList[lOpen[0].Region + 1 - 1][i]); t.Previous = lOpen[0]; //5. Если порожденная вершина целевая, т.е. принадлежит Sq то выдать решение с помощью указателей, иначе перейти к шагу №2. if (t.Equals(finishPos)) { GeneratePath(); Animate(); TestPath(path); } else { lOpen.Add(t); } } } lClosed.Add(lOpen[0]); lOpen.RemoveAt(0); } Log(string.Format("Best path BFS: {0:#.##}", bestPathLen)); }
private void HeuristicsSearch() { //1. Поместить все узлы из множества So в список OPEN. lOpen.Add(startPos); traversed = false; while (!traversed) { //Log(string.Format("Open: {0}, closed: {1}.", lOpen.Count, lClosed.Count)); if (lOpen.Count == 0) { traversed = true; break; } int p = 1; // search [open] for p and q int pos = 0; double minDist = double.MaxValue; foreach (Point3dNode node in lOpen) { double dist = MeasureDist(node, finishPos); if (dist < minDist) { minDist = dist; q = pos; } pos++; } if (lOpen[q].Region == 4) { GeneratePath(); Animate(); TestPath(path); } //q = 0; if (lOpen[q].Region <= 3) // можно раскрыть { //4. Раскрыть вершину n и все порождённые вершины поместить в список OPEN настроив указатели к вершине n for (int i = 0; i < chkpntList[lOpen[q].Region + 1 - 1].Count; i++) { Point3dNode t = new Point3dNode(chkpntList[lOpen[q].Region + 1 - 1][i]); t.Previous = lOpen[q]; //5. Если порожденная вершина целевая, т.е. принадлежит Sq то выдать решение с помощью указателей, иначе перейти к шагу №2. if (t.Equals(finishPos)) { GeneratePath(); Animate(); TestPath(path); } else { lOpen.Add(t); //lOpen.Insert(p, t); //if (q >= p) q += p; } } } lClosed.Add(lOpen[q]); lOpen.RemoveAt(q); } Log(string.Format("Best path EVR: {0:#.##}", bestPathLen)); }