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