所以在我写的一个程序中,我使用双向广度优先搜索来搜索图形。我通过在1个线程中运行1个广度优先搜索,然后在另一个线程中执行此操作来执现在搜索被认为找到了最佳解决方案,当它来自其他搜索的元素被击中时,或者当找到目标时(从未真正发生过,但以防万一它出于某种原因......)。 p>
我遇到的问题是,我需要将这个最佳解决方案保存到字段中,因为我需要继续查找所有解决方案,但是字段值变得混乱,因为两个线程都在同一时间(我想)。
有没有办法阻止访问最后到达那里的线程?我已经尝试过使用AtomicReference及其compareAndSet方法,但这并不能解决问题。价值仍然搞砸....
顺便说一下,我正在使用java,对于我正在使用Callable对象的线程。
答案 0 :(得分:1)
由于线程的随机顺序,您可能会发现Livelock
或Race condition
。我建议采取不同的方法。 (否则在某些时候你会遇到NP-Complete
)。
我遇到的问题是,我需要将最佳解决方案保存到字段中。 因为我需要继续找到所有解决方案,但是字段值变得混乱,因为两个线程同时点击它(我认为)。
有一种方法可以大大增加您当前的技术。您不需要查看每个解决方案,只需Greedy Approach
并使用Paralleled version
Dijkstra's Shortest Path Algorithm
。
最短路径(或在您的情况下最佳解决方案)
Dijkstra算法是一种图搜索算法,它解决了具有非负边缘路径成本的图的单源最短路径问题,从而生成最短路径树。该算法通常用于路由和其他图算法中的子程序。
线性实施
原始算法图1.(Source)
Parallel PDF Algorithm Linear http://iforce.co.nz/i/w4b43s1r.34o.png
的Java实现并行实施
并行算法图2.(Source)
recursion
来加速算法。Parallel PDF Algorithm Atomic http://iforce.co.nz/i/15ndcts5.p3a.png
如果您仍然遇到问题,另一个想法可能是使用不同的并发数据结构,例如Map Reduce
或Hadoop
,而不是使用Threads
来搜索Binary Tree
,以修复您的搜索。
答案 1 :(得分:1)
注意:不是答案,只是检查算法的有效性
您的算法实际上是否产生最短路径?考虑一下这个图:
1A - 2A - 3A - 4A - 5A
\ /
-- 2B -------
并假设完美的交织(每个线程以完全相同的速率访问节点)。线程X
从1A
开始,线程Y
从5A
开始。订单看起来像这样:
X visits 1A +{2A, 2B}
Y visits 5A +{4A}
X visits 2A +{3A}
Y visits 4A +{3A, 2B}
X visits 2B +{4A}
Y visits 3A +{2A}
X visits 3A (overlap; shortest path is computed to be 4)
但我们从检查中知道最短路径为3:1A - 2B - 4A - 5A
。
您的方法如何防止这种情况发生?无论您采用哪种方法检查重复项,我都会在3A
之前看到2B
重叠。在决定最佳路径长度之前,您是否总是完成“级别”?