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