예제 #1
0
        /// <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();
            //}
        }
예제 #2
0
        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;
        }