Beispiel #1
0
        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));
        }
Beispiel #2
0
        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));
        }