Распараллелить рекурсивную функцию JavaJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Распараллелить рекурсивную функцию Java

Сообщение Anonymous »

Я изучаю 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»