我一直在尝试并行化广度优先搜索功课,到目前为止我还有半工作代码。对于某些情况,它可以工作(虽然我不能说是否必须更快),但对于某些情况,它会引发异常,因为Sucessors()
没有为null
定义。但是,据我所知,我的队列null
中永远不应该有q
。它始终以q
中的1个项目开头,然后我从q
中取出所有项目并将它们放入队列r
中,这样我就可以完成树的一层并添加下一个图层回到q
。然后,我希望并行查找r
中每个项目的所有后继者以及任何新状态(由Sucessor()
检查),如果有任何解决方案,则将其添加回q
已被发现。检查是否已经到达状态未锁定,因此可能会重新访问旧状态,但这应该只添加一些双重工作。有谁知道null
如何进入r
?
// Do BFS
while (true)
{
while (q.Count > 0)
{
Tuple<byte[], Solution> currentState = q.Dequeue();
r.Enqueue(currentState);
}
// Generate sucessors, and push them on to the queue if they haven't been seen before
Parallel.ForEach(r, state =>
{
foreach (Tuple<byte[], Solution> next in Sucessors(state))
{
if (next.Item1[targetVehicle] == goal)
{
foundSolution = next.Item2;
solfound = true;
}
if (next != null)
q.Enqueue(next);
}
}
);
if (solfound == true || q == null)
{
Console.WriteLine(foundSolution);
Console.ReadLine();
break;
}
}
编辑:我已经将q
变成了ConcurrentQueue,因为enqueue有时会引起一些问题。这实际上解决了空引用,但是现在程序在并行中比并行显着更慢。即使锁定旧状态的检查,它也无法识别出无法控制的电路板。