private static void RunAlgorithmsWithLocalSearch(IGraph graph, ISolver solver, string coordinatesPath, string resultsPath)
        {
            var edgeFinder     = new EdgeFinder();
            var graspEdgeFiner = new GraspEdgeFinder(3);

            var localSearchSolver = new TspLocalSearchSolver(graph);

            var localSearchALgorithm = new LocalSearchAlgorithm(Steps, edgeFinder);

            var generatedPaths = solver.Solve(new NearestNeighborAlgorithm(Steps, edgeFinder));

            localSearchSolver.Solve(localSearchALgorithm, generatedPaths);
            LocalSearchResultPrinter(localSearchSolver, "NN_LS", coordinatesPath, resultsPath).Print("NN with local search opt");

            generatedPaths = solver.Solve(new GreedyCycleAlgorithm(Steps, edgeFinder));
            localSearchSolver.Solve(localSearchALgorithm, generatedPaths);
            LocalSearchResultPrinter(localSearchSolver, "GC_LS", coordinatesPath, resultsPath).Print("GC with local search opt");

            generatedPaths = solver.Solve(new NearestNeighborAlgorithm(Steps, graspEdgeFiner));
            localSearchSolver.Solve(localSearchALgorithm, generatedPaths);
            LocalSearchResultPrinter(localSearchSolver, "NNG_LS", coordinatesPath, resultsPath).Print("NN Grasp with local search opt");

            generatedPaths = solver.Solve(new GreedyCycleAlgorithm(Steps, graspEdgeFiner));
            localSearchSolver.Solve(localSearchALgorithm, generatedPaths);
            LocalSearchResultPrinter(localSearchSolver, "GCG_LS", coordinatesPath, resultsPath).Print("GC GRASP with local search opt");

            generatedPaths = solver.Solve(new RandomPathAlgorithm(Steps, edgeFinder));
            localSearchSolver.Solve(localSearchALgorithm, generatedPaths);
            LocalSearchResultPrinter(localSearchSolver, "Random_LS", coordinatesPath, resultsPath).Print("RANDOM with local search opt");
        }
    private string[] transformSquad(GameState gameState, Zone currentZone)
    {
        Log("Squad at #{0} is transformed to a new EdgeFinder", this.ZoneId);
        var squad = new EdgeFinder(this.Pods, this.ZoneId);

        gameState.Squads.Remove(this);
        gameState.Squads.Add(squad);
        squad.BeforeMove(gameState);
        var result = squad.Move(gameState).ToArray();

        return(result);
        //TODO: When to call AfterMove()?
    }