/// <summary> /// 构建列车弧 /// </summary> /// <param name="arcCount"></param> private void create_Line_T_S_Arcs(ref int arcCount) { for (int i = 0; i < T_S_NodeList.Count - 1; i++) { for (int j = i + 1; j < i + 2 /*T_S_NodeList.Count*/; j++) { // 因为在创建并添加点的时候,同一Line的出发点和到达点是先后创建添加的,所以内层不用循环 T_S_Node startPoint = T_S_NodeList[i]; T_S_Node endPoint = T_S_NodeList[j]; if (startPoint.LineID == endPoint.LineID && startPoint.PointType == 1 && endPoint.PointType == 2 && ((startPoint.TimeCode < 1440 && endPoint.TimeCode < 1440) || (startPoint.TimeCode >= 1440 && endPoint.TimeCode >= 1440))) { T_S_Arc t_s_arc = new T_S_Arc(); t_s_arc.Init_db(startPoint, endPoint, arcCount, startPoint.LineID, startPoint.RountingID, startPoint.TrainCode, startPoint.ID, endPoint.ID, startPoint.StaCode, endPoint.StaCode, startPoint.TimeCode, endPoint.TimeCode, 1);//1——运行弧 T_S_ArcList.Add(t_s_arc); startPoint.Out_T_S_ArcList.Add(t_s_arc); arcCount++; } } } }
/// <summary> /// 构建出退乘弧,包括虚拟乘务组出退乘弧,即停驻弧 /// </summary> /// <param name="arcCount"></param> private void create_OnAndOff_T_S_Arcs(ref int arcCount) { #region 创建出退乘弧 // 只需要一次遍历,因为目的就是把位于基地所在站的stationNode与基地起终点相连 for (int i = 0; i < T_S_NodeList.Count; i++) { T_S_Node stationPoint = T_S_NodeList[i]; T_S_Node baseStartPoint = null; T_S_Node baseEndPoint = null; bool isBaseStation = false; foreach (var crewbase in CrewBaseList) { if (stationPoint.StaCode == crewbase.StaCode) { isBaseStation = true; baseStartPoint = T_S_NodeList[crewbase.VirStartPointID - 1]; baseEndPoint = T_S_NodeList[crewbase.VirEndPointID - 1]; break; } } if (!isBaseStation) { continue; } if (stationPoint.PointType == 1 && stationPoint.TimeCode < 1440) { T_S_Arc t_s_arc = new T_S_Arc(); t_s_arc.Init_db(baseStartPoint, stationPoint, arcCount, 0, stationPoint.RountingID, stationPoint.TrainCode, baseStartPoint.ID, stationPoint.ID, stationPoint.StaCode, stationPoint.StaCode, 0, stationPoint.TimeCode, 31);//31——出乘弧 T_S_ArcList.Add(t_s_arc); baseStartPoint.Out_T_S_ArcList.Add(t_s_arc); arcCount++; } if (stationPoint.PointType == 2) { T_S_Arc t_s_arc = new T_S_Arc(); t_s_arc.ArcType = 32;//32——退乘弧 t_s_arc.Init_db(stationPoint, baseEndPoint, arcCount, 0, 0, stationPoint.TrainCode, stationPoint.ID, baseEndPoint.ID, stationPoint.StaCode, stationPoint.StaCode, stationPoint.TimeCode, 1440, 32);//32——退乘弧 if (t_s_arc.StartTimeCode > 1440) { t_s_arc.EndTimeCode = 2880; } T_S_ArcList.Add(t_s_arc); stationPoint.Out_T_S_ArcList.Add(t_s_arc); arcCount++; } } // 创建虚拟停驻弧,即虚拟乘务组出乘弧 foreach (CrewBase crewbase in CrewBaseList) { T_S_Node startPoint = T_S_NodeList[crewbase.VirStartPointID - 1]; T_S_Node endPoint = T_S_NodeList[crewbase.VirEndPointID - 1]; T_S_Arc t_s_arc = new T_S_Arc(); t_s_arc.Init_db(startPoint, endPoint, arcCount, 0, 0, "", crewbase.VirStartPointID, crewbase.VirEndPointID, crewbase.StaCode, crewbase.StaCode, 0, 1440, //若是两天会有些变化 33); //33——虚拟乘务组出退乘弧 T_S_ArcList.Add(t_s_arc); startPoint.Out_T_S_ArcList.Add(t_s_arc); arcCount++; } #endregion }
/// <summary> /// 创建日间连接弧和夜间连接弧 /// </summary> /// <param name="arcCount"></param> /// <param name="minConnTime"></param> /// <param name="maxConnTime"></param> private void create_Connect_T_S_Arcs(ref int arcCount, int minConnTime, int maxConnTime) { Dictionary <string, List <T_S_Node> > StationToPointDict = new Dictionary <string, List <T_S_Node> >(); foreach (var point in T_S_NodeList) { if (point.PointType == 3 || point.PointType == 4) { continue; } if (!StationToPointDict.ContainsKey(point.StaCode)) { StationToPointDict.Add(point.StaCode, new List <T_S_Node>()); } StationToPointDict[point.StaCode].Add(point); } foreach (var pointset in StationToPointDict.Values) { pointset.Sort(T_S_Node_AscByTime.pointAsc); for (int i = 0; i < pointset.Count; i++) { T_S_Node startPoint = pointset[i]; if (startPoint.PointType == 1) { continue; // 连接弧的起点必须是到达点 } for (int j = i + 1; j < pointset.Count; j++) { // 因为排序了,所以后面的node j必然不早于前面的node i,所以可以直接 i + 1 T_S_Node endPoint = pointset[j]; if (endPoint.PointType == 2) { continue; // 连接弧的终点必须是出发点 } int len = endPoint.TimeCode - startPoint.TimeCode; if (len < minConnTime) { continue; } else if (len > maxConnTime) { break; } else { // 不考虑多天的情况,暂且仅考虑1天 // 故在此可以直接创建弧 T_S_Arc t_s_arc = new T_S_Arc(); t_s_arc.Init_db(startPoint, endPoint, arcCount, startPoint.LineID, startPoint.RountingID, startPoint.TrainCode, startPoint.ID, endPoint.ID, startPoint.StaCode, endPoint.StaCode, startPoint.TimeCode, endPoint.TimeCode, 21);//21——日间连接弧 T_S_ArcList.Add(t_s_arc); startPoint.Out_T_S_ArcList.Add(t_s_arc); arcCount++; } } } } }