Я изучаю Java и написал рекурсивную функцию поиска, чтобы найти лучший ход в простой настольной игре для одного игрока, используя грубую силу.
class Game {
class Move{
int x, y, value;
//constructors
};
class Board{}; //and all necessary functions
private Move search(Board board) {
if (gameOver(board)) {
return new Move(evaluateBoard(board));
}
var bestMove = new Move();
for (var move : getMoves(board)) {
move.value = search(makeMove(board, move)).value;
if (move.value > bestMove.value) {
bestMove = move;
}
}
return bestMove;
}
}
Теперь я пытаюсь сделать многопоточный поиск параллельным. Я не могу использовать платформу fork and join, потому что не могу разделить функцию на независимые части. Я попробовал следующее, но это не помогло
AtomicInteger threadCount = new AtomicInteger();
private static final int MAX_THREADS = 10;
ExecutorService executorService = Executors.newFixedThreadPool(MAX_THREADS);
private Move searchParallel(Board board) throws InterruptedException, ExecutionException {
if (gameOver(board)) {
return new Move(evaluateBoard(board));
}
List tasks = new ArrayList();
var lock = new Object();
var bestMove = new Move();
for (var move : getMoves(board)) {
if(threadCount.get() < MAX_THREADS){
threadCount.incrementAndGet();
tasks.add(() -> {
var bestMove1 = new Move();
move.value = searchParallel(makeMove(board, move)).value;
synchronized (lock){
if (move.value > bestMove1.value) {
bestMove1 = move;
}
}
threadCount.decrementAndGet();
return bestMove1;
});
}
else {
move.value = searchParallel(makeMove(board, move)).value;
synchronized (lock) {
if (move.value > bestMove.value) {
bestMove = move;
}
}
}
}
var results = executorService.invokeAll(tasks);
for(var move : results){
if (move.get().value > bestMove.value) {
bestMove = move.get();
}
}
return bestMove;
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... e-function
Распараллелить рекурсивную функцию Java ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Создайте синтаксический анализатор, используя рекурсивную функцию [закрыто]
Anonymous » » в форуме C++ - 0 Ответы
- 84 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как реализовать рекурсивную функцию факториала без использования оператора умножения?
Anonymous » » в форуме Python - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-