public static void CancelVisitedMarksInOptimalRoutes(OptimalRoutesCollection optimalRoutes)
 {
     foreach (OptimalRoute r in optimalRoutes)
     {
         r.CancelVisitedMark();
     }
 }
        public static OptimalRoutesCollection FindOptimalRoutes(GeoCoords nowPos, GeoCoords needPos, DateTime time, Dictionary <Priority, double> priorities, IEnumerable <RouteType> types = null, double speed = 5, double dopTimeMinutes = 2, double percentTotalTime = 1, double percentTotalGoingTime = 1, double percentTotalTransportChangingCount = 1)
        {
            int n1 = 1, n2 = 1;

            if (priorities == null || priorities.Count == 0)
            {
                throw new Exception("Не заданы приоритеты.");
            }

            OptimalRoutesCollection findedOptimalRoutes = new OptimalRoutesCollection();

            //DateTime ttt1 = DateTime.Now;
            findedOptimalRoutes.Add(new OptimalRoute(nowPos, needPos, time, types, speed, dopTimeMinutes));
            //MessageBox.Show((DateTime.Now - ttt1).TotalMilliseconds.ToString());

            //return findedOptimalRoutes;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1

            List <Route> ignoringRoutes   = new List <Route>();


            Stack <Priority> myPriorities = new Stack <Priority>(priorities.Keys);
            //for (Priority currentPriority = myPriorities.Pop(); myPriorities.Count != 0; currentPriority = myPriorities.Pop())
            //{
            Priority currentPriority      = myPriorities.Pop();
            //double ddd = priorities[currentPriority];
            double ddd = 0.25;// 0.95;// 0.85; // Порог эффективности маршрута по выбранному критерию.

            if (ddd > 1 || ddd < 0.25)
            {
                throw new Exception("Priority must been from [0.25; 1]");
            }
            //List<IgnoringFragment> globalIgnoringFragments = new List<IgnoringFragment>();
            IgnoringFragments ignoringFragments = new IgnoringFragments();//!!!!!!!!!!!!!!

            //List<IgnoringFragment> currentIgnoringFragments;

            //Point myStartPoint = findedOptimalRoutes[0].startPoint;

            for (OptimalRoute selectedOptimalRoute = findedOptimalRoutes[0]; selectedOptimalRoute != null; selectedOptimalRoute.Visited(), selectedOptimalRoute = SelectOptimalRouteWithMinimalMark(findedOptimalRoutes, Priority.MinimalTime))
            {
                ignoringRoutes = new List <Route>();//!!!!!!!!!!!1111111111
                // Проходим по всем ребрам выбранного пути и строим новые маршруты при удалении ребер:
                for (Points.Point tmpP = selectedOptimalRoute.myPoints.finalPoint; tmpP.Previous != null; tmpP = tmpP.Previous)
                {
                    if (tmpP.Route != null && !ignoringRoutes.Contains(tmpP.Route))
                    {
                        ignoringRoutes.Add(tmpP.Route);
                    }


                    ////// Игнорируемое "ребро":
                    ////IgnoringFragment tmpIgnFragm = new IgnoringFragment(tmpP.StationCode, tmpP.RouteCode, tmpP.PreviousStationCode);

                    //////!!!!!!!!!!!!!!!!!//
                    ////ignoringFragments = new IgnoringFragments(selectedOptimalRoute.myIgnoringFragments);//!!!!

                    ////if (ignoringFragments.Contains(tmpIgnFragm)) continue;
                    ////ignoringFragments.Add(tmpIgnFragm);

                    ////Points myPoints = null;
                    //////Point myFinishPoint = null;
                    ////OptimalRoute tmpOptimalRoute = null;

                    //////myPoints = selectedOptimalRoute.MyPoints.Downgrade(ignoringFragments);
                    //////myFinishPoint = selectedOptimalRoute.finalPoint.Downgrade(ignoringFragments);

                    //////myPoints = tmpP.Previous.CurrentGraph;

                    ////// Строим новый маршрут, избегая указанные ребра:
                    ////tmpOptimalRoute = new OptimalRoute(nowPos, needPos, time, types, speed, dopTimeMinutes, ignoringList: ignoringFragments/*,/*myStartPoint,*/ /*myPoints*//*, myFinishPoint*/);


                    ////n2++;
                    ////if (tmpOptimalRoute.TotalTime.TotalSeconds <= findedOptimalRoutes[0].TotalTime.TotalSeconds / ddd)
                    ////{
                    ////    string tmpJSON = JsonConvert.SerializeObject(tmpOptimalRoute.points);
                    ////    bool ok = false;
                    ////    foreach (OptimalRoute opt in findedOptimalRoutes)
                    ////    {
                    ////        if (JsonConvert.SerializeObject(opt.points) == tmpJSON)
                    ////        {
                    ////            ok = true;
                    ////            break;
                    ////        }
                    ////    }
                    ////    if (ok) continue;
                    ////    findedOptimalRoutes.Add(tmpOptimalRoute);
                    ////    n1++;
                    ////}
                }
                foreach (Route r in ignoringRoutes)
                {
                    if (selectedOptimalRoute.ignoringRoutes.Contains(r))
                    {
                        continue;
                    }
                    List <Route> ignoringRoutesAdd = new List <Route>(selectedOptimalRoute.ignoringRoutes);
                    ignoringRoutesAdd.Add(r);
                    OptimalRoute tmpOptimalRoute = new OptimalRoute(nowPos, needPos, time, types, speed, dopTimeMinutes, ignoringRoutesAdd: ignoringRoutesAdd);

                    n2++;
                    if (tmpOptimalRoute.TotalTime.TotalSeconds <= findedOptimalRoutes[0].TotalTime.TotalSeconds / ddd)
                    {
                        string tmpJSON = JsonConvert.SerializeObject(tmpOptimalRoute.points);
                        bool   ok      = false;
                        foreach (OptimalRoute opt in findedOptimalRoutes)
                        {
                            if (JsonConvert.SerializeObject(opt.points) == tmpJSON)
                            {
                                ok = true;
                                break;
                            }
                        }
                        if (ok)
                        {
                            continue;
                        }
                        findedOptimalRoutes.Add(tmpOptimalRoute);
                        n1++;
                    }
                }
            }
            //MessageBox.Show(n1 + " from " + n2);
            return(findedOptimalRoutes);
        }
        public static OptimalRoute GetBestOptimalRoute(GeoCoords nowPos, GeoCoords needPos, DateTime time, Dictionary <Priority, double> priorities, IEnumerable <RouteType> types = null, double speed = 5, double dopTimeMinutes = 2, double percentTotalTime = 1, double percentTotalGoingTime = 1, double percentTotalTransportChangingCount = 1)
        {
            OptimalRoutesCollection tmp = FindOptimalRoutes(nowPos, needPos, time, priorities, types, speed, dopTimeMinutes, percentTotalTime, percentTotalGoingTime, percentTotalTransportChangingCount);

            return(tmp.Customize(percentTotalTime, percentTotalGoingTime, percentTotalTransportChangingCount));
        }