示例#1
0
        public void BreadthFirstSearch_ShouldThrowArgumentNullException_WhenInputParametersAreInvalid(GraphBase<int> graph, int initialVertex, Action<int> action)
        {
            var bfsAlgorithm = new BreadthFirstSearch<GraphBase<int>, int>();

            Assert.Throws<ArgumentNullException>(() =>
            {
                bfsAlgorithm.Execute(graph, initialVertex, action);
            });
        }
示例#2
0
        public void BreadthFirstSearch_ShouldThrowArgumentException_WhenInitialVertexDoesNotExistInGraph(GraphBase<int> graph, int initialVertex)
        {
            var bfsAlgorithm = new BreadthFirstSearch<GraphBase<int>, int>();

            Assert.Throws<ArgumentException>(() =>
            {
                bfsAlgorithm.Execute(graph, initialVertex, vertex => { });
            });
        }
示例#3
0
        public void Execute(Graph graph)
        {
            BreadthFirstSearch algorithm = new BreadthFirstSearch();
            var vertices = algorithm.Execute(graph, graph.StartPoint, graph.EndPoint);

            string count = (vertices.Count()).ToString();

            System.Console.WriteLine($"De talisman licht op en fluistert dat het eindpunt {count} ver weg is");
        }
示例#4
0
        public void BreadthFirstSearch_ShouldPerformSpecifiedAction_ForAllVerticesInConnectedComponent(GraphBase<int> graph, int initialVertex, IEnumerable<int> expectedVisitedVertices)
        {
            var bfsAlgorithm = new BreadthFirstSearch<GraphBase<int>, int>();
            var result = new List<int>();

            bfsAlgorithm.Execute(graph, initialVertex, vertex =>
            {
                result.Add(vertex);
            });

            Assert.Equal(expectedVisitedVertices, result);
        }
示例#5
0
    private void CreatePathsToAllGreenTiles(Grid <Tile> grid, int iteration = 0)
    {
        //WARNING: DO NOT ADD LOGS WITHOUT PERFORMANCE CONSIDERATION
        //This function can get called a lot. If there are a lot of logs, it can freeze the game.

        iteration++;

        var allGreenTiles   = GetAllGreenTiles(grid);
        var randomGreenTile = allGreenTiles.Values.ToList()[Random.Range(0, allGreenTiles.Count)];

        //Try to visit every single grass tile using breadth first search.
        var breadthsFirstSearch = new BreadthFirstSearch(grid, true);

        breadthsFirstSearch.Execute(randomGreenTile, int.MaxValue, new List <TileType> {
            TileType.Grass
        });
        var visitedTiles = breadthsFirstSearch.GetVisitedTiles();

        visitedTiles[(randomGreenTile.GridX, randomGreenTile.GridY)] = randomGreenTile;
        public override void Execute()
        {
            // build the graph
            Graph <T> graph = new Graph <T>();

            //graph.AddUndirectedEdge("Frankfurt", "Wiesbaden", 40);
            //graph.AddUndirectedEdge("Frankfurt", "Mainz", 30);
            //graph.AddUndirectedEdge("Mainz", "Wiesbaden", 15);
            //graph.AddUndirectedEdge("Rüdesheim", "Geisenheim", 4);

            foreach (MatchPair <T> matchpair in this.matches)
            {
                graph.AddUndirectedEdge(matchpair.From, matchpair.To, matchpair.Cost);
            }

            BreadthFirstSearch <T> bfsSearch = new BreadthFirstSearch <T>();

            // take every node from the graph as startnode for the search e.g. "Frankfurt", "Wiesbaden", "Mainz", "Rüdesheim", "Geisenheim"
            GraphNode <T> startNode = null;
            GraphNode <T> endNode   = null;
            int           cost      = graph.Infinity;
            int           i         = 0;

            while (i < graph.Nodes.Count)
            {
                var cluster = new List <MatchPair <T> >();

                // take current node as startnode and search the whole graph for reachable nodes
                startNode = (GraphNode <T>)graph.Nodes[i];
                bfsSearch.Execute(startNode, null, null);

                // add the found nodes to the subgraph
                int j = 0;
                while (j < bfsSearch.AllNodes.Count)
                {
                    endNode = (GraphNode <T>)bfsSearch.AllNodes[j];
                    cost    = startNode.CostToNeighbor(endNode);

                    if (!startNode.Equals(endNode))
                    {
                        var matchPair = new MatchPair <T>(startNode.Value, endNode.Value, cost);

                        // check, if it is in the original list
                        if (this.matches.Contains(matchPair))
                        {
                            // check, if a connection point (startnode or endnode) is already in another cluster
                            var found = this.IsInOtherCluster(matchPair);

                            if (!found)
                            {
                                // add to the new cluster
                                cluster.Add(matchPair);
                            }
                        }
                    }

                    j++;
                }

                // when a cluster was build, add to the clusterlist
                if (cluster.Count > 0)
                {
                    this.clusters.Add(cluster);
                }

                // clusters will be e.g.
                // Cluster 1: (Frankfurt, Wiesbaden, Mainz)
                // Cluster 2: (Rüdesheim, Geisenheim)

                i++;
            }
        }