簡體   English   中英

並行深度優先搜索

[英]Depth first search in parallel

我正在實現一個DFS以查找迷宮的出口,當前它是單線程的。

我正計划通過創建多個使用相同的單線程算法搜索樹的線程來提高效率,但是我將在遇到相交點時隨機選擇哪個方向。

例如,線程遇到一個可以向東或向西移動的交叉點。 他們一半去東方,一半去西方。 這一直持續到線程之一找到解決方案路徑為止。

這是並行實現DFS的有效方法嗎?

如果您使用Java進行遞歸並行工作,請使用Java 7中引入的Fork and Join API。

public class MazeNode {
  // This class represents a Path from the start of your maze to a certain node. It can be a) a dead end, b) the exit, c) have child Paths
  ...
}

public class MazeTask extends RecursiveTask<MazeNode>
{
  private MazeNode node;

  MazeTask(MazeNode node) {
    this.node = node;
  }


  // Returns null or the exit node
  @Override
  protected MazeNode compute() {    
  if (node.isDeadEnd())
    return null;
  else if (node.isExit())
    return node;
  else { // node has ways to go
    // implement as many directions as you want
    MazeTask left = new MazeTask(node.getLeft());
    MazeTask right = new MazeTask(node.getRight());

    left.fork(); // calculate in parallel

    MazeNode rightNode = right.compute(); // calculate last Task directly to save threads
    MazeNode leftNode = left.join(); // Wait for the other task to complete and get result

    if (rightNode != null)
      return rightNode;
    else
      return leftNode; // This assumes there is only one path to exit
  }
}


public static void main(String[] args) {
  MazeNode maze = ...
  MazeNode exit = new ForkJoinPool().invoke(new MazeTask(maze));
}

[UPDATE1]

這是我關於線程同步的建議(但是基於我們與@IraBaxter的討論,我現在不確定我的方式是否會帶來任何好處):

當算法啟動時,只有一個線程才需要,直到您到達第一個派生。 當這一個線程到達那里時,應將所有可能的結果(左,右,中間)放入堆棧並停止。 然后,由於堆棧中有一些元素,因此激活了多個線程以從堆棧中存儲的邊開始。 當這些線程中的每一個到達派生狀態時,所有結果都將放到堆棧中,線程會自行停止(並非一次全部停止,每個線程都在需要時執行操作)並從堆棧中獲取邊緣。 等等。 每次任何線程停止時(無論是由於分叉還是死角),它都會切換到等待堆棧邊緣的模式(如果堆棧不為空,則取一個)。 每次將某些邊緣添加到堆棧時,都會通知線程有關堆棧的非空性。

我在這里用術語“邊緣”來表示叉子的位置以及從給定叉子到哪里的方向。 堆棧為您提供算法的深度優先屬性。

PS:可以通過減少同步點的數量來優化此方法。 我們可以在每個線程的單獨工作清單中收集分叉邊緣,並且直到該線程到達死角時才停止它。 我們從此工作清單中排除了該線程決定在每個分叉上繼續前進的那些邊。 然后,當線程到達死胡同時,我們將本地工作列表遷移到全局工作列表。 因此,同步用於空閑線程從全局工作列表中的點開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM