private void IdentifyRoutes(List<List<Node>> allRoutes, List<Node> currentList, Graph map)
        {
            foreach (var node in map.Nodes)
            {
                if (currentList.Count > 0)
                    if (!map.EdgeExists(currentList.Last(), node.Value))
                        continue;

                if ((currentList.Select(x => x.Key).Contains(node.Key)))
                    continue;

                if (currentList.Count < map.Nodes.Count - 1)
                {
                    if (!(currentList.Select(x => x.Key).Contains(node.Key)))
                    {
                        var newList = CloneList(currentList);
                        newList.Add(node.Value);
                        IdentifyRoutes(allRoutes, newList, map);
                    }
                }
                else
                {
                    var newList = CloneList(currentList);
                    newList.Add(node.Value);

                    if (!map.EdgeExists(currentList.Last(), currentList.First()))
                        continue;

                    newList.Add(currentList.First());
                    allRoutes.Add(newList);
                }
            }
        }
 public List<List<Node>> GetAllNodeLists(Graph map)
 {
     var currentList = new List<Node>();
     var allRoutes = new List<List<Node>>();
     IdentifyRoutes(allRoutes, currentList, map);
     return allRoutes;
 }
        public void InterfaceTest()
        {
            var map = new Graph();
            map.Nodes.Add("A", new Node("A"));
            map.Nodes.Add("B", new Node("B"));
            map.Nodes.Add("C", new Node("C"));
            map.Nodes.Add("D", new Node("D"));
            map.Nodes["A"].Edges.Add(map.Nodes["B"], 20);
            map.Nodes["A"].Edges.Add(map.Nodes["D"], 35);
            map.Nodes["A"].Edges.Add(map.Nodes["C"], 42);
            map.Nodes["B"].Edges.Add(map.Nodes["A"], 20);
            map.Nodes["B"].Edges.Add(map.Nodes["C"], 30);
            map.Nodes["B"].Edges.Add(map.Nodes["D"], 34);
            map.Nodes["C"].Edges.Add(map.Nodes["A"], 42);
            map.Nodes["C"].Edges.Add(map.Nodes["B"], 30);
            map.Nodes["C"].Edges.Add(map.Nodes["D"], 12);
            map.Nodes["D"].Edges.Add(map.Nodes["A"], 35);
            map.Nodes["D"].Edges.Add(map.Nodes["B"], 34);
            map.Nodes["D"].Edges.Add(map.Nodes["C"], 12);

            var tspResolver = new TspResolver();
            IEnumerable<Node> result = tspResolver.ResolveBruteForce(map);

            Debug.Print("Answer: " + result.Select(x => x.Key).Aggregate((x, y) => string.Format("{0} => {1}", x, y)));
        }
        public IEnumerable<Node> ResolveBruteForce(Graph map)
        {
            List<Node> result = null;
            int resultScore = -1;

            foreach (List<Node> nodeList in GetAllNodeLists(map))
            {
                var score = GetScore(nodeList);
                Debug.Print(nodeList.Select(x => x.Key).Aggregate((x, y) => string.Format("{0} => {1}", x, y)));
                Debug.Print(score.ToString(CultureInfo.InvariantCulture));
                if (resultScore == -1 || score < resultScore)
                {
                    resultScore = score;
                    result = new List<Node>();
                    result.AddRange(nodeList);
                }
            }

            return result;
        }