懒得勤快 6 years ago
parent
commit
2de22b5c42
6 changed files with 171 additions and 32 deletions
  1. 2 2
      Masuit.Tools/Masuit.Tools.csproj
  2. 1 1
      Masuit.Tools/packages.config
  3. 1 0
      NetCoreTest/Program.cs
  4. 163 29
      Test/Program.cs
  5. 3 0
      Test/Test.csproj
  6. 1 0
      Test/packages.config

+ 2 - 2
Masuit.Tools/Masuit.Tools.csproj

@@ -48,8 +48,8 @@
       <HintPath>..\..\MyBlogs\packages\SharpZipLib.1.0.0\lib\net45\ICSharpCode.SharpZipLib.dll</HintPath>
     </Reference>
     <Reference Include="Microsoft.CSharp" />
-    <Reference Include="Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
-      <HintPath>..\..\MyBlogs\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
+    <Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <HintPath>..\..\MyBlogs\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
     </Reference>
     <Reference Include="StackExchange.Redis, Version=1.2.6.0, Culture=neutral, processorArchitecture=MSIL">
       <HintPath>..\packages\StackExchange.Redis.1.2.6\lib\net45\StackExchange.Redis.dll</HintPath>

+ 1 - 1
Masuit.Tools/packages.config

@@ -2,7 +2,7 @@
 <packages>
   <package id="AngleSharp" version="0.9.11" targetFramework="net45" />
   <package id="HtmlSanitizer" version="4.0.199" targetFramework="net45" />
-  <package id="Newtonsoft.Json" version="11.0.2" targetFramework="net45" />
+  <package id="Newtonsoft.Json" version="12.0.1" targetFramework="net45" />
   <package id="SharpZipLib" version="1.0.0" targetFramework="net45" />
   <package id="StackExchange.Redis" version="1.2.6" targetFramework="net45" />
 </packages>

+ 1 - 0
NetCoreTest/Program.cs

@@ -13,5 +13,6 @@ namespace NetCoreTest
         public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
             WebHost.CreateDefaultBuilder(args)
                 .UseStartup<Startup>();
+
     }
 }

+ 163 - 29
Test/Program.cs

@@ -1,38 +1,172 @@
-using Masuit.Tools.DateTimeExt;
-using System;
+using System;
+using System.Collections.Generic;
+using System.Linq;
 
 namespace Test
 {
-    internal static class Program
+    /// <summary>
+    /// 路由计算引擎
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    public class RouteEngine<T>
     {
-        static void Main(string[] args)
+        /// <summary>
+        /// 节点信息
+        /// </summary>
+        private List<Node<T>> Nodes { get; set; }
+
+        /// <summary>
+        /// 路由结果
+        /// </summary>
+        private Dictionary<string, int> RouteList { get; set; } = new Dictionary<string, int>();
+
+        public RouteEngine(List<Node<T>> nodes)
+        {
+            Nodes = nodes;
+        }
+
+        /// <summary>
+        /// 递归将每条路都计算出来
+        /// </summary>
+        /// <param name="node"></param>
+        /// <param name="route"></param>
+        /// <param name="dis"></param>
+        private void InterateRoute(Node<T> node, string route, int dis)
+        {
+            if (node.Prevs.Any())
+            {
+                foreach (var prev in node.Prevs)
+                {
+                    RouteList[prev.Key.Name + "," + route] = dis + prev.Value;
+                    InterateRoute(prev.Key, prev.Key.Name + "," + route, dis + prev.Value);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 获得路径
+        /// </summary>
+        /// <param name="start"></param>
+        /// <param name="end"></param>
+        /// <param name="shortest"></param>
+        /// <returns></returns>
+        public (List<Route<T>>, HashSet<Node<T>>) GetRoutes(Node<T> start, Node<T> end, bool shortest)
         {
-            DateTime dt = DateTime.Parse("2019-2-6");
-            ChineseCalendar cc = new ChineseCalendar(dt);
-            Console.WriteLine("阳历:" + cc.DateString);
-            Console.WriteLine("属相:" + cc.AnimalString);
-            Console.WriteLine("农历:" + cc.ChineseDateString);
-            Console.WriteLine("时辰:" + cc.ChineseHour);
-            Console.WriteLine("节气:" + cc.ChineseTwentyFourDay);
-            Console.WriteLine("节日:" + cc.DateHoliday);
-            Console.WriteLine("农历节日:" + cc.ChineseCalendarHoliday);
-            Console.WriteLine("前一个节气:" + cc.ChineseTwentyFourPrevDay);
-            Console.WriteLine("后一个节气:" + cc.ChineseTwentyFourNextDay);
-            Console.WriteLine("干支:" + cc.GanZhiDateString);
-            Console.WriteLine("星期:" + cc.WeekDayStr);
-            Console.WriteLine("星宿:" + cc.ChineseConstellation);
-            Console.WriteLine("星座:" + cc.Constellation);
-            Console.WriteLine("是否是假期:" + cc.IsHoliday);
-            Console.WriteLine("是否是工作日:" + cc.IsWorkDay);
-
-            //DateTime today = DateTime.Parse("2019-1-31");
-            //ChineseCalendar.CustomWorkDays.Add(DateTime.Parse("2019-02-02"));
-            //ChineseCalendar.CustomWorkDays.Add(DateTime.Parse("2019-02-03"));
-            //var cc = new ChineseCalendar(today);
-            //var ccEnd = cc.AddWorkDays(4);
-            //var endDate = ccEnd.Date;
-            //Console.WriteLine(endDate);
+            InterateRoute(end, end.Name, 0);
+            var list = new List<Route<T>>();
+            var nodes = new HashSet<Node<T>>();
+            var routes = RouteList.Where(k => k.Key.StartsWith(start.Name) && k.Key.EndsWith(end.Name));
+            var route = (shortest ? routes.OrderBy(x => x.Value) : routes.OrderByDescending(x => x.Value)).FirstOrDefault().Key;
+            string[] strs = route.Split(',');
+            for (var i = 0; i < strs.Length - 1; i++)
+            {
+                Node<T> src = Nodes.Find(n => n.Name.Equals(strs[i]));
+                Node<T> dest = Nodes.Find(n => n.Name.Equals(strs[i + 1]));
+                list.Add(new Route<T>(src, dest, dest.Prevs[src]));
+                nodes.Add(src);
+                nodes.Add(dest);
+            }
+            return (list, nodes);
         }
     }
 
+    /// <summary>
+    /// 路由
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    public class Route<T>
+    {
+        public Route(Node<T> src, Node<T> dest, int distance)
+        {
+            Source = src;
+            Dest = dest;
+            Distance = distance;
+        }
+
+        /// <summary>
+        /// 开始节点
+        /// </summary>
+        public Node<T> Source { get; set; }
+
+        /// <summary>
+        /// 结束节点
+        /// </summary>
+        public Node<T> Dest { get; set; }
+
+        /// <summary>
+        /// 距离
+        /// </summary>
+        public int Distance { get; set; }
+    }
+
+    /// <summary>
+    /// 节点
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    public class Node<T>
+    {
+        public Node(string name)
+        {
+            Name = name;
+            Prevs = new Dictionary<Node<T>, int>();
+        }
+
+        /// <summary>
+        /// 节点名
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 前面的节点以及到前一个节点需要的距离
+        /// </summary>
+        public Dictionary<Node<T>, int> Prevs { get; set; }
+    }
+
+    class Program
+    {
+        static void Main(string[] args)
+        {
+            Node<string> a = new Node<string>("A");
+            Node<string> b = new Node<string>("B");
+            Node<string> c = new Node<string>("C");
+            Node<string> d = new Node<string>("D");
+            Node<string> e = new Node<string>("E");
+            SetRoutePath(a, b, 1);
+            SetRoutePath(b, c, 2);
+            SetRoutePath(a, c, 2);
+            SetRoutePath(b, d, 3);
+            SetRoutePath(c, d, 5);
+            SetRoutePath(b, e, 9);
+            SetRoutePath(d, e, 4);
+            List<Node<string>> nodes = new List<Node<string>>()
+            {
+                a,
+                b,
+                c,
+                d,
+                e
+            };
+            var engine = new RouteEngine<string>(nodes);
+            var (routes, routeNodes) = engine.GetRoutes(a, e, false);
+            foreach (var x in routes)
+            {
+                Console.WriteLine(x.Source.Name + "->" + x.Dest.Name + ":" + x.Distance);
+            }
+
+            Console.WriteLine("最长路径:" + string.Join("->", routeNodes.Select(x => x.Name)) + ":" + routes.Sum(r => r.Distance));
+
+            (routes, routeNodes) = engine.GetRoutes(a, e, true);
+            foreach (var x in routes)
+            {
+                Console.WriteLine(x.Source.Name + "->" + x.Dest.Name + ":" + x.Distance);
+            }
+
+            Console.WriteLine("最短路径:" + string.Join("->", routeNodes.Select(x => x.Name)) + ":" + routes.Sum(r => r.Distance));
+        }
+
+        private static void SetRoutePath(Node<string> start, Node<string> end, int distance)
+        {
+            end.Prevs.Add(start, distance);
+        }
+    }
 }

+ 3 - 0
Test/Test.csproj

@@ -64,6 +64,9 @@
     <Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
       <HintPath>..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
     </Reference>
+    <Reference Include="System.ValueTuple, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll</HintPath>
+    </Reference>
     <Reference Include="System.Xml.Linq" />
     <Reference Include="System.Data.DataSetExtensions" />
     <Reference Include="Microsoft.CSharp" />

+ 1 - 0
Test/packages.config

@@ -8,4 +8,5 @@
   <package id="StackExchange.Redis" version="1.2.6" targetFramework="net45" />
   <package id="System.Buffers" version="4.4.0" targetFramework="net45" />
   <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net45" />
+  <package id="System.ValueTuple" version="4.3.0" targetFramework="net45" />
 </packages>