Exemplo n.º 1
0
 public Point(Node n)
 {
     size = Settings1.Default.NodeSize;
 }
Exemplo n.º 2
0
 public AdjNode(Graph g, int nn, int rn)
 {
     graph = g;
     node = g.GetNode(nn);
     route = rn;
 }
Exemplo n.º 3
0
        public void LookAt(Node n)
        {
            n.Visit();
            foreach (string s in n.d.Keys)
            {
            #if DEBUG
                Console.WriteLine("s = \"{0}\"", s);
            #endif

                string last = "";
                string prelast = "";
                int ln = 0, lr = -1, pln = -2, plr = -2;

                try
                {
                    last = s.Split(' ')[s.Split(' ').Length - 1];
                    prelast = s.Split(' ')[s.Split(' ').Length - 2];

                    ln = int.Parse(regex.Match(last).Groups[1].Value);
                    lr = int.Parse(regex.Match(last).Groups[2].Value);

                    pln = int.Parse(regex.Match(prelast).Groups[1].Value);
                    plr = int.Parse(regex.Match(prelast).Groups[2].Value);

                }
                catch { }
            #if DEBUG
                Console.WriteLine("ln = {0} lr = {1} pln = {2} plr = {3}", ln,lr,pln,plr);
            #endif

                    foreach (AdjNode an in n.neighbors)
                    {
            #if DEBUG
                        Console.WriteLine(an.ToString());
            #endif

                        if (!an.node.Visited && (an.node.n != pln))
                        {
                            try
                            {
                                int p;
                                if (an.route == lr || lr == -1)
                                {
                                    Console.WriteLine("+1");
                                    //Console.WriteLine("an.node.d.Add({0}, {1});", n.d[s] + " n" + an.node.n + "r" + an.route, n.d[s] + 1);
                                    an.node.d.Add(s + " n" + an.node.n + "r" + an.route, n.d[s] + 1);
                                    p = n.d[s] + 1;
                                }

                                else
                                {
                                    Console.WriteLine("+4");
                                    //Console.WriteLine("an.node.d.Add({0}, {1});", n.d[s] + " n" + an.node.n + "r" + an.route, n.d[s] + 4);
                                    an.node.d.Add(s + " n" + an.node.n + "r" + an.route, n.d[s] + 4);
                                    p = n.d[s] + 4;
                                }

                                pq.Enqueue(p, an.node);

                            }

                            catch { }

                        }
                }

            }
        }
Exemplo n.º 4
0
        public Graph(ArrayList p, Route[] r)
        {
            points = p;
                routes = r;
                int n = p.Count;
                nodes = new Node[n];

                for (int i = 0; i < n; i++)
                {
                    nodes[i] = new Node(this, i);
                }

                for (int i = 0; i < r.Length; i++)
                {
                    for (int j = 0; j < r[i].Length - 1; j++)
                    {
                        // инициализация смежных

                        Node n1 = nodes[r[i].nodes[j]];
                        Node n2 = nodes[r[i].nodes[j + 1]];

                        n1.AddAdj(r[i].nodes[j + 1], i);
                        n2.AddAdj(r[i].nodes[j], i);

                        try
                        {
                            Console.WriteLine("node{0}.routes.Add({1})", n1.n, r[i]);
                            n1.routes.Add(r[i]);
                            n1.routesValues.Add(r[i], int.MaxValue/2);

                        }

                        catch (Exception ex) { Console.WriteLine(ex.Message); }

                        try {
                            Console.WriteLine("node{0}.routes.Add({1})", n2.n, r[i]);
                            n2.routes.Add(r[i]);
                            n2.routesValues.Add(r[i], int.MaxValue/2);
                        }

                        catch (Exception ex) { Console.WriteLine(ex.Message); }
                        /*
                        if (j == r[i].Length - 2)
                        {
                            for (int h = 0; h < r.Length; h++)
                            {
                                for (int g = 0; g < r[h].nodes.Length - 1; g++)
                                {

                                    if (r[h].nodes[g] == r[i].nodes[j])
                                    {
                                        nodes[r[h].nodes[g + 1]].routesValues.Add(GetRoute(h), int.MaxValue / 2);
                                    }
                                }
                            }
                            //r[i].nodes[j]
                        }*/

                    }
                    try
                    {
                        for (int h = 0; h < r.Length; h++)
                        {
                            for (int g = 0; g < r[h].nodes.Length - 1; g++)
                            {

                                if (r[h].nodes[g] == r[i].nodes[r[i].Length - 1])
                                {
                                    nodes[r[h].nodes[g + 1]].routesValues.Add(GetRoute(i), int.MaxValue / 2);
                                }
                            }
                        }
                    }
                    catch { }

                    nodes[r[i].nodes[0]].routesValues[r[i]] = 0;

                }
        }
Exemplo n.º 5
0
        /// <summary>
        /// Обработка узла. Смотрит соседние и, если нужно производит релаксацию
        /// </summary>
        /// <param name="s"></param>
        public void LookAroundNode(Node s)
        {
            try
            {
            #if DEBUG
                Console.WriteLine(s);
            #endif
                Node cn = s;
                cn.Visit();
                foreach (AdjNode an in cn.neighbors)
                {
                    if (!an.node.Visited) //|| cn.routesValues.Count>an.node.routesValues.Count)
                    {
                        int w;

                        Route r = GetRoute(an.route);

                        //string s = "";
                        //s+=cn.d

                        an.node.RouteVisit(r);
                        Node nn = an.node;

                        int pr;
                        int c = 0;
                        if (cn.routesValues[r] == 0)
                        {
                            // в маршруте это первый узел
                            var items = from item in cn.routesValues
                                        orderby item.Value ascending
                                        select item.Value;
                            if (items.ToArray().Count() > 1)
                            {
                                pr = (int)items.ToArray().GetValue(1) + 4;
                                nn.routesValues[r] = pr;
                                c = 0;
                            }
                            else
                            {
                                pr = (int)items.ToArray().GetValue(0) + 1;
                                nn.routesValues[r] = pr;
                                c = 1;
                            }

                        }

                        else
                        {
                            if (cn.route != r)
                            {

                                var items = from item in cn.routesValues
                                            orderby item.Value ascending
                                            select item.Value;
                                pr = (int)items.ToArray().GetValue(0) + 4;
                                nn.routesValues[r] = pr;
                                c = 2;
                            }
                            else
                            {
                                nn.routesValues[r] = cn.routesValues[r] + 1;
                                pr = cn.routesValues[r] + 1;
                                c = 3;
                            }
                        }

                        //an.node.route = r;
                        //if
                        pq.Enqueue(pr, an.node);

                        //an.node.NewRouteValue(

                        #region OLD
                        /*
                        if (an.route == cn.r || cn.r == -1) w = 1; else w = 4;

                        if (cn.route == GetRoute(an.route)){
                            if (an.node.NewRouteValue(GetRoute(an.route), cn.routesValues[cn.route] + 1)) { Console.WriteLine("Новая пара ключ-значение"); }
                            pq.Add(new KeyValuePair<int,Node>(cn.routesValues[cn.route] + 1, an.node));
                        }
                        else {
                            Console.WriteLine("C таким ключом уже есть");
                            an.node.NewRouteValue(GetRoute(an.route),cn.routesValues[cn.route]+4);
                            pq.Add(new KeyValuePair<int,Node>(cn.routesValues[cn.route] + 4, an.node));

                        }

                        foreach (Route r in an.node.routesValues.Keys)
                        {
                            Console.WriteLine("{0} - {1}", r.n, an.node.routesValues[r]);
                        }

                        //Route[] array = new Route[an.node.routesValues.Keys.Count];
                        //an.node.routesValues.Keys.CopyTo(array,0);
                        //Console.WriteLine(array.ToString());
                        //Console.WriteLine(an.node.routesValues.Values.ToString());

                        /*
                        try
                        {
                            if (cn.len + w < an.node.len)
                            {
                                //an.node.routesValues[Route(cn.r)] = cn.len + w;

                                //Console.WriteLine(an.node.routesValues);
                                // релаксация нашли более короткий путь
                                Console.WriteLine("Релаксация в {0} было {1}, стало {2}", an, an.node.len, cn.len + w);
                                an.node.len = cn.len + w;
                                an.node.r = an.route;
                                an.node.prevn = s.n;
                                an.node.prev = s;
                            }
                        }
                        catch (Exception ee)
                        {
                            Console.WriteLine(ee.Message);
                        }*/

                        #endregion OLD
                    }
                }

            }
            catch (Exception ex) {
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.StackTrace);
            }
        }