@Test
  public void testSolving() {
    GridModel grid = new GridModel(4);

    GridFiller filler = new GridFiller(grid);
    filler.fillRandom(grid.getSize() * 3 / 2);
    grid.shuffle();

    ClusterManager cluster = new ClusterManager(new NullLog());
    GridModel solutionGrid = new GridModel();

    AStarSolverMkI solver = new AStarSolverMkI(grid, solutionGrid, cluster);
    solver.run();
    assertTrue(solutionGrid.isComplete());
  }
  private static void computeStats(
      List<String> solvers, List<String> paths, int samples, int sizeMin, int sizeMax)
      throws InterruptedException, ExecutionException {
    // Grid cpuGrid = GridFactory.start();

    for (int gridsize = sizeMin; gridsize <= sizeMax; gridsize++) {

      int patterns = (int) (gridsize * 1.5);
      Collector reference = null;

      for (String solverName : solvers) {

        List<String> pathsQueue = new ArrayList<String>();
        if (SolverFactory.isSolverPathSensitive(solverName)) {
          pathsQueue.addAll(paths);
        } else {
          pathsQueue.add(null);
        }

        for (String pathName : pathsQueue) {

          String collectorName = computeCollectorName(solverName, pathName, gridsize, patterns);

          Collector collector = new Collector(collectorName, reference);
          if (reference == null) {
            reference = collector;
          }

          // ExecutorService executor =
          // cpuGrid.newGridExecutorService();
          ExecutorService executor =
              Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
          Set<Future<Collector>> collectors = new LinkedHashSet<Future<Collector>>();

          for (int sample = 0; sample < samples; sample++) {
            GridModel grid = new GridModel(gridsize);
            GridFiller filler = new GridFiller(grid);
            filler.fillRandom(patterns);
            grid.shuffle();
            SolverMeter solverMeter = new SolverMeter(solverName, pathName, grid);
            collectors.add(executor.submit(solverMeter));
          }

          for (Future<Collector> futureCollector : collectors) {
            collector.recordExecutions(futureCollector.get());
          }

          executor.shutdown();
          while (!executor.isTerminated()) {
            try {
              executor.awaitTermination(10, TimeUnit.SECONDS);
            } catch (InterruptedException e) {
              // Do nothing, keep looping
            }
          }

          collector.displayResults();
        }
      }

      System.out.println();
    }
  }