介绍
示例
测试代码:
[TestClass]
public class TestTSP
{
BidirectionalGraph<string, EquatableEdge<string>> _graph
= new BidirectionalGraph<string, EquatableEdge<string>>();
private readonly Dictionary<EquatableEdge<string>, double> _weightsDict
= new Dictionary<EquatableEdge<string>, double>();
private void AddVertex(string v)
{
_graph.AddVertex(v);
}
private void AddEdge(string from, string to, double weight = 1)
{
var e1 = new EquatableEdge<string>(from, to);
var e2 = new EquatableEdge<string>(to, from);
_graph.AddEdge(e1);
_graph.AddEdge(e2);
_weightsDict.Add(e1, weight);
_weightsDict.Add(e2, weight);
}
public Func<EquatableEdge<string>, double> GetWeightsFunc()
{
return edge => _weightsDict[edge];
}
[TestMethod]
public void Test1()
{
AddVertex("n1");
AddVertex("n2");
AddVertex("n3");
AddVertex("n4");
AddVertex("n5");
AddVertex("n6");
AddEdge("n1", "n2", 10);
AddEdge("n2", "n3", 8);
AddEdge("n3", "n4", 11);
AddEdge("n4", "n5", 6);
AddEdge("n5", "n6", 9);
AddEdge("n1", "n6", 3);
AddEdge("n2", "n6", 5);
AddEdge("n3", "n6", 18);
AddEdge("n3", "n5", 21);
var tsp = new TSP<string, EquatableEdge<string>, BidirectionalGraph<string, EquatableEdge<string>>>(_graph, GetWeightsFunc());
tsp.Compute();
var r = tsp.ResultPath;
if (r == null)
{
Console.WriteLine("无解");
return;
}
//连成一条路径
var dict = r.Edges.ToDictionary(x => x.Source, x => x.Target);
var start = dict.Keys.First();
var cur = start;
var pathVertexs = new List<string>();
pathVertexs.Add(start);
while (dict.TryGetValue(cur, out string next) && next != start)
{
cur = next;
pathVertexs.Add(next);
}
pathVertexs.Add(start);
Console.WriteLine($"Path={string.Join("->", pathVertexs)}");
Console.WriteLine($"Cost={tsp.BestCost}");
}
}
控制台输出结果:
Path=n1->n6->n5->n4->n3->n2->n1
Cost=47
效果图:
左图为输入数据,右图为计算得到的最优的旅行商旅行路径:从n1出发,访问各个节点后再回到起点。