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; }