如果我在 isVisited 上放置同步,并行图遍历可以工作吗?

Can parallel graph traversal work if I put synchronized on isVisited?

提问人:COOLBEANS 提问时间:3/18/2019 最后编辑:COOLBEANS 更新时间:3/20/2019 访问量:60

问:

我知道这句话:

非确定性 = 状态 + 并行性

我使用不可变的 Vector[Vector[Int]] 作为(邻接矩阵,即图形)来跟踪单元格之间的连接并构建新的边界单元格。一些线程似乎省略了这里和那里新边界单元的创建。我认为这可能是因为遍历图形是有状态的!我需要每个节点上的布尔值 isVisited 变量。我像这样将它混合到 Cell case 类中:

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)
斯卡拉 并行处理 不变性 可变

评论

1赞 Suma 3/19/2019
你说“蒙特卡洛”。这假设了一个随机或伪随机生成器,这是一个“状态”。随机性是如何与你的计算联系起来的?
0赞 COOLBEANS 3/19/2019
我用一些相关细节更新了我的问题。随机性仅限于游戏循环,其中每步都是随机的,当棋盘状态检测到获胜者时结束。
0赞 COOLBEANS 3/19/2019
实际上,边界单元的创建需要我遍历一个以布尔访问字段形式具有状态的图形。

答: 暂无答案