Exemple #1
0
 /// <summary>
 /// 递归出一个节点下指定次数的所有路径
 /// </summary>
 /// <param name="nodes">收集并反回所有节点</param>
 /// <param name="start">起始节点</param>
 /// <param name="parent">父级节点</param>
 /// <param name="level">递归层次</param>
 /// <param name="stop">终结次数</param>
 public static void ErgodicNodeFromStart(ref IList <EmbranchmentShippingNode> nodes,
                                         Embranchment start,
                                         EmbranchmentShippingNode parent, int level, int stop)
 {
     if (nodes == null)
     {
         nodes = new List <EmbranchmentShippingNode>();
     }
     if (level < stop)
     {
         //首次获取起始节点,后面取父级节点
         IList <EmbranchmentShipping> shippings = null;
         if (parent == null)
         {
             shippings = EmbranchmentShipping.EmbranchmentShippings.Where(a => a.From.Name.Equals(start.Name)).ToList();
         }
         else
         {
             shippings = EmbranchmentShipping.EmbranchmentShippings.Where(a => a.From.Name.Equals(parent.To.Name)).ToList();
         }
         foreach (var embranchmentShipping in shippings)
         {
             var node = new EmbranchmentShippingNode();
             node.From = embranchmentShipping.From;
             node.To   = embranchmentShipping.To;
             if (parent == null)
             {
                 node.Paths = new List <EmbranchmentShipping>();
                 node.Paths.Add(embranchmentShipping);
             }
             else
             {
                 var paths = parent.Paths.ToList();
                 paths.Add(embranchmentShipping);
                 node.Paths = paths;
             }
             nodes.Add(node);
             ErgodicNodeFromStart(ref nodes, start, node, level + 1, stop);
         }
     }
 }
Exemple #2
0
        private void btnCaculate_Click(object sender, EventArgs e)
        {
            lbxResult.Items.Clear();
            try
            {
                var paths = txtInputPath.Text.Replace("\r\n", ",").Split(',');

                for (int i = 0; i < paths.Length; i++)
                {
                    var message = string.Empty;
                    var path    = paths[i].Trim();
                    if (i <= 4)
                    {
                        int sumWeighting = EmbranchmentShipping.ShippingToEmbranchment(path);
                        if (sumWeighting > 0)
                        {
                            message = sumWeighting.ToString();
                        }
                        else
                        {
                            message = "NO SUCH PATH";
                        }
                    }
                    else if (i == 5)
                    {
                        var pathNodes = path.Split('-');
                        var from      = pathNodes[0];
                        var to        = pathNodes[1];
                        var start     = Embranchment.Embranchments.Where(a => a.Name.Equals(from)).FirstOrDefault();
                        IList <EmbranchmentShippingNode> result = null;
                        //递归起始节点4次,遍历出该节点下的路径
                        EmbranchmentShippingNode.ErgodicNodeFromStart(ref result, start, null, 0, 3);
                        message = result.Where(a => a.To.Name.Equals(to)).Count().ToString();
                    }
                    else if (i == 6)
                    {
                        var pathNodes = path.Split('-');
                        var from      = pathNodes[0];
                        var to        = pathNodes[1];
                        var start     = Embranchment.Embranchments.Where(a => a.Name.Equals(from)).FirstOrDefault();
                        IList <EmbranchmentShippingNode> result = null;
                        //递归起始节点4次,遍历出该节点下的路径
                        EmbranchmentShippingNode.ErgodicNodeFromStart(ref result, start, null, 0, 4);
                        var plans = result.Where(a => a.Paths.Count == 4 && a.To.Name.Equals(to)).ToList();
                        message = plans.Count.ToString();
                    }
                    else if (i == 7 || i == 8)
                    {
                        var pathNodes = path.Split('-');
                        var from      = pathNodes[0];
                        var to        = pathNodes[1];
                        var start     = Embranchment.Embranchments.Where(a => a.Name == from).FirstOrDefault();
                        IList <EmbranchmentShippingNode> result = null;
                        //递归起始节点10次,遍历出该节点下的路径,过滤出源到目标的最短发货时间
                        EmbranchmentShippingNode.ErgodicNodeFromStart(ref result, start, null, 0, 10);
                        var plans       = result.Where(a => a.To.Name.Equals(to)).ToList();
                        int minDuration = 0;
                        int sumDuration = 0;
                        foreach (var plan in plans)
                        {
                            sumDuration = plan.Paths.Sum(a => a.Duration);
                            if (minDuration == 0 || minDuration > sumDuration)
                            {
                                minDuration = sumDuration;
                            }
                        }
                        message = minDuration.ToString();
                    }
                    else if (i == 9)
                    {
                        var pathNodes = path.Split('-');
                        var from      = pathNodes[0];
                        var to        = pathNodes[1];
                        var start     = Embranchment.Embranchments.Where(a => a.Name == from).FirstOrDefault();
                        IList <EmbranchmentShippingNode> result = null;
                        //递归起始节点10次,遍历出该节点下的路径,过滤出源到目标的权重范围内的路径
                        EmbranchmentShippingNode.ErgodicNodeFromStart(ref result, start, null, 0, 10);
                        var plans = result.Where(a => a.To.Name.Equals(to)).ToList();
                        message = plans.Where(a => a.Paths.Sum(b => b.Duration) < 30).Count().ToString();
                    }
                    lbxResult.Items.Add(message);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("可能输入数据的格式不正确." + ex.Message);
            }
        }