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