【QuikGraph】图算法之TSP旅行商问题求解

介绍

QuikGraph的TSP的API地址

示例

测试代码:

    [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出发,访问各个节点后再回到起点。
在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值