/// <summary> /// Esploratore /// </summary> /// <param name="visitedPoints">Punti già visistati</param> /// <param name="currentPoint">Punto corrente</param> /// <param name="reaminingPoints">Punti ancora da visitare</param> /// <param name="end">Arrivo (punto finale)</param> public Explorer(List<Point> visitedPoints, Point currentPoint, List<Point> reaminingPoints, Point end) { TwoOptEngine.ExplorerCounter++; // Clonazione delle liste per non influire con gli altri explorer List<Point> clonedVisitedPoints = Clone(visitedPoints); List<Point> clonedReaminingPoints = Clone(reaminingPoints); Point clonedCurrentPoint = currentPoint.Clone(); // aggiunto il punto corrente a quelli già visistati clonedVisitedPoints.Add(clonedCurrentPoint); double currentCost = Route.CalculateCost(visitedPoints); if(TwoOptEngine.BestRoute == null || currentCost < TwoOptEngine.BestRoute.Cost) { // ricerca dei 2 punti più vicini al punto corrente List<Point> nearPoints = GetNearPoints(clonedCurrentPoint, clonedReaminingPoints); // se non ho più punti da visitare => sono arrivato! if (nearPoints.Count == 0) { // creo la route route.Points = clonedVisitedPoints; route.Points.Add(end); // sono arrivato in fondo TwoOptEngine.OnFinished(route); //Dispose(); } // creazione di 2 nuovi esploratori per i 2 punti vicini foreach (Point point in nearPoints) { clonedReaminingPoints.Remove(point); Explorer expoler = new Explorer(clonedVisitedPoints, point, clonedReaminingPoints, end); clonedReaminingPoints.Add(point); } } //else //{ // Dispose(); //} }
public Route Solve(List<Point> points) { BestRoute = null; ExplorerCounter = 0; ExplorerFinishedCounter = 0; this.startPoint = points.First(p => p.Type == PointType.Start); this.endPoint = points.First(p => p.Type == PointType.End); // remaining points List<Point> unvisitedPoints = points.Where(p => p.Type == PointType.Waypoiny).ToList(); // Start del primo explorer Explorer explorer = new Explorer(new List<Point>(), this.startPoint, unvisitedPoints, this.endPoint); BestRoute.Result = String.Format("Total: {0}, Finished: {1}, Cost: {2}", ExplorerCounter, ExplorerFinishedCounter, Convert.ToInt32(BestRoute.Cost)); return BestRoute; }