예제 #1
0
        /// <summary>
        /// Обход в ширину (вниз, по направлению к источнику)
        /// </summary>
        /// <param name="start">Начало обхода</param>
        /// <param name="processVertex">(int vertexID) => bool. Если возвращает false, то обход заканчивается и BFS возвращает vertexID </param>
        /// <param name="processAdjacent">(v, a) => bool. Если возвращает false, то вершина a не добавляется в очередь и обход в направлении v->a не идет</param>
        /// <returns>Точка, на которой законечен обход</returns>
        public static int BFSUp <TVertex, TEdge>(IDirectedNetwork <TVertex, TEdge> network, int start, Func <int, bool> processVertex, Func <int, int, bool> processAdjacent)
        {
            int           current = start;
            HashSet <int> visited = new HashSet <int>();

            Queue <int> q = new Queue <int>();

            q.Enqueue(start);
            visited.Add(start);

            while (q.Count != 0)
            {
                current = q.Dequeue();

                if (processVertex(current))
                {
                    return(current);
                }

                foreach (int adj in network.getPredecessors(current))
                {
                    if (!visited.Contains(adj))
                    {
                        if (processAdjacent(current, adj))
                        {
                            q.Enqueue(adj);
                        }
                        visited.Add(adj);
                    }
                }
            }

            return(-1);
        }
예제 #2
0
        private bool testArmTask(IDirectedNetwork <CommonJunction, CommonJunction> network, IDirectedNetwork <CommonJunction, CommonJunction> expected_result, int edgeID)
        {
            DirectedNetworkTracer tracer = new DirectedNetworkTracer(network);
            IDirectedNetwork <CommonJunction, CommonJunction> result = tracer.armTask(edgeID).network;

            return(compareNetworks(result, expected_result));
        }
예제 #3
0
        protected bool compareNetworks <TVertex, TEdge>(IDirectedNetwork <TVertex, TEdge> n1, IDirectedNetwork <TVertex, TEdge> n2)
        {
            bool equal_vertexes = compareCollections(n1.Vertexes.Select(x => x.id), n2.Vertexes.Select(x => x.id));
            bool equal_edges    = compareCollections(n1.Edges.Select(x => x.id), n2.Edges.Select(x => x.id));

            if (equal_edges && equal_vertexes)
            {
                return(true);
            }
            return(false);
        }
예제 #4
0
        private bool testArmExample(string name, int EdgeID)
        {
            yEdDirectedNetwork network = new yEdDirectedNetwork();

            network.setSymbols(this.symbols_to_classes);
            network.loadFromXml(this.getExample(name));
            DirectedNetworkTracer tracer = new DirectedNetworkTracer(network);

            yEdDirectedNetwork expected_result = new yEdDirectedNetwork();

            expected_result.setSymbols(this.symbols_to_classes);

            expected_result.loadFromXml(this.getExample(name + "_result"));

            IDirectedNetwork <CommonJunction, CommonJunction> result = tracer.armTask(EdgeID).network;

            return(compareNetworks(result, expected_result));
        }
예제 #5
0
        public static int BFSDownMultipleSources <TVertex, TEdge>(IDirectedNetwork <TVertex, TEdge> network, int[] sources, Func <int, bool> processVertex, Func <int, int, bool> processAdjacent)
        {
            if (sources.Length == 0)
            {
                return(-1);
            }

            int current = sources.First();

            HashSet <int> visited = new HashSet <int>();

            Queue <int> q = new Queue <int>();

            foreach (int v in sources)
            {
                q.Enqueue(v);
                visited.Add(v);
            }

            while (q.Count != 0)
            {
                current = q.Dequeue();

                if (processVertex(current))
                {
                    return(current);
                }

                foreach (int adj in network.getSuccessors(current))
                {
                    if (!visited.Contains(adj))
                    {
                        if (processAdjacent(current, adj))
                        {
                            q.Enqueue(adj);
                        }
                        visited.Add(adj);
                    }
                }
            }

            return(current);
        }
예제 #6
0
 public DirectedNetworkTracer(IDirectedNetwork <CommonJunction, CommonJunction> network)
 {
     this.network = network;
 }