Какой метод параллелизма закрытия использовать при поиске в растущем пространстве решений?

Как правильно в Clojure выполнять параллельную обработку, когда каждое задание обработки может выполняться в полной изоляции и может генерировать список дополнительных заданий, которые необходимо оценить?

Мои фактические Проблема - это проблема с расчетом питания, но я представлю ее в форме шахмат, которые разделяют те же черты проблемного пространства, что и мой расчет.

Предположим, например, что я пытаюсь найти все ходы матов в шахматной игре. При поиске состояний на доске я бы начал с 20 возможных состояний, каждое из которых представляет свой возможный ход открытия. Каждый из них необходимо будет оценить, принять или отклонить, а затем для каждого принятого хода будет создан новый список заданий, представляющий все возможные следующие шаги.Задания будут выглядеть следующим образом:

initial: '([] proposed-move)
accepted: '([move] proposed-response)
          '([move move] proposed-response)

Число состояний для оценки растет в результате каждого вычисления, и каждое состояние можно оценивать в полной изоляции от всех остальных.

Решение, с которым я играю, выглядит следующим образом:

; a list of all final solutions, each of which is a sequence of moves
(def solutions (agent []))
; a list of all jobs pending evaluation
(def jobs (agent []))

Учитывая эти определения, у меня будет пул потоков Java, и каждый поток будет запрашивать задание у агента заданий (и ждать выполнения этого запроса). Затем он запустит расчет, сгенерирует список решений и возможных решений. Наконец, он отправит решения агенту решений, а возможные решения - агенту заданий.

Является ли использование комбинации агентов и потоков наиболее идиоматическим подходом в данном случае? Могу ли я получить данные из очереди заданий так, как я предлагаю?

Или мои задания должны быть java.util.concurrent.LinkedBlockingQueue, как описано в Потребитель-производитель с квалификацией ?

5
задан Community 23 May 2017 в 11:48
поделиться