尝试多线程搜索广度优先

时间:2016-01-09 15:12:52

标签: c# multithreading exception parallel-processing null

我一直在尝试并行化广度优先搜索功课,到目前为止我还有半工作代码。对于某些情况,它可以工作(虽然我不能说是否必须更快),但对于某些情况,它会引发异常,因为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有时会引起一些问题。这实际上解决了空引用,但是现在程序在并行中比并行显着更慢。即使锁定旧状态的检查,它也无法识别出无法控制的电路板。

0 个答案:

没有答案