/** * Somewhat multi-threaded depth-first search. Performs a DFS of the subtrees from the current * node in parallel. * * @param s The tile sequence * @param b The board to search * @param pool The thread pool in which to submit jobs to. * @return The board with the highest evaluation or null if no board can continue. */ private Board solve_pdfs(Board b, ExecutorService pool) { List<Future<Board>> rets = new ArrayList<>(BOARD_WIDTH); Board best = null; int best_score = -1; for (Direction d : directions) { Board n = new Board(b); if (n.move(tileSequence, d)) { rets.add(pool.submit(new ParallelDFS(n))); } } for (Future<Board> ret : rets) { try { Board c = ret.get(); if (c != null) { int score = evaluate(c); if (score > best_score) { best = c; best_score = score; } } } catch (InterruptedException | ExecutionException e) { System.err.println("Error: " + e.getMessage()); } } return best; }
private Board solve_dfs(Board b, int depthLimit, int depth) { if (depth >= depthLimit) { // Cutoff test return b; } Board best = null; int best_score = -1; for (int i = 0; i < BOARD_WIDTH; i++) { Board next = new Board(b); if (next.move(tileSequence, directions[i])) { Board candidate = solve_dfs(next, depthLimit, depth + 1); if (candidate == null && next.finished()) { candidate = next; } if (candidate != null) { if (candidate.finished()) { updateBest(candidate); } else { int score = evaluate(candidate); if (score > best_score) { best_score = score; best = candidate; } } } } } return best; }