Я изучаю 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
Программисты JAVA общаются здесь
1716041728
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;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78499981/parallelize-java-recursive-function[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия