Может ли параллельный обход графика работать, если я поставлю синхронизированный на isVisited? - PullRequest
0 голосов
/ 17 марта 2019

Мне известно утверждение:

недетерминизм = состояние + параллелизм

Я использую неизменный Vector [Vector [Int]] в качестве (матрицы смежности, то есть графика), чтобы отслеживать соединения между ячейками и создавать новые граничные ячейки. Кажется, что некоторые потоки пропускают создание новых граничных ячеек здесь и там. Я думаю, что это может быть потому, что пересечение графика является статичным !. Мне нужна логическая переменная isVisited на каждом узле. Я смешиваю его с классом Cell, например:

sealed trait Vertex { var visited = false }

Есть ли что-то, что я могу сделать здесь? Мне кажется, что я должен иметь возможность принудительно использовать только один поток на задачу в моем ParArray - тогда мне не нужно об этом беспокоиться - я думаю?

Для получения дополнительной информации:

У меня есть класс дел, представляющий Board, который использует ТОЛЬКО неизменные коллекции:

case class Board(rCells: Vector[RCell], 
                 vCells: Vector[Cell], 
                 edges:  Vector[Vector[Int]])

и Клетки, которые являются прямоугольными объектами, которые движутся вокруг доски и сливаются вместе при наложении: обратите внимание, я расширяю вершину сверху.

`case class RCell(x1: Int,
                  y1: Int,
                  x2: Int, 
                  y2: Int, 
                  override val marker: Int, 
                  override val id: Int = -1) extends Cell with Vertex

Это выглядит так:

enter image description here

Я выполняю поиск по дереву Монте-Карло, который включает в себя многие тысячи игр. Я пытаюсь сделать это параллельно так:

val result: ParSeq[Seq[Node]] = 
for(i <- (0 until numCores).par) yield  
    new MonteCarloTreeSearch().findNextMove(board, player, 2000)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...