Мне известно утверждение:
недетерминизм = состояние + параллелизм
Я использую неизменный 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
Это выглядит так:
Я выполняю поиск по дереву Монте-Карло, который включает в себя многие тысячи игр. Я пытаюсь сделать это параллельно так:
val result: ParSeq[Seq[Node]] =
for(i <- (0 until numCores).par) yield
new MonteCarloTreeSearch().findNextMove(board, player, 2000)