我目前正在实施prolog程序来计算两点之间的最短路径。 该框架已经存在于Java项目中。作为要求,路径必须在序言中实现。 所以我用gnu.prolog(http://www.gnu.org/software/gnuprologjava/)序言上的性能问题
的Java应用我称之为searchPath(1,5,Path)
的将返回Path=[5,4,3,2,1]
这里是我的序言代码:
:- dynamic(path/3).
findPath([Goal | Rest], Goal, Temp, Temp, [Goal | Rest]).
findPath([A | Rest], Goal, Cost, Temp, Path) :-
path(A,B,C),
\+member(B, [A | Rest]),
NewCosts is (Temp + C),
findPath([B, A | Rest], Goal, Cost, NewCosts, Path).
searchPath(Start,Goal,Path_to_goal) :-
findPath([Start], Goal, Cost1, 0, Path),
findPath([Start], Goal, Cost2, 0, Path2),
Cost1=<Cost2,
Path_to_goal = Path.
我有两个问题与:
searchPath
方法应该返回最短路径。然而它 确实不是。这导致我的幻影“决定”在某点处切换 方向,导致幻影从左边的 向右抖动。我的序言代码最多需要6秒才能返回结果。我不需要告诉你这是太多的时间。不过有时prolog只需要19ms。我无法弄清楚这取决于哪些情况。例如,一个包含99个元素的路径列表需要19ms的时间来计算,但是在一个仅包含38个元素的列表上花费了6秒。
你能提出任何改进建议吗?
感谢您的帮助提前!
谢谢您的建议。代码完美。但不幸的是,有一个原因,它不能帮助我:这个项目是大学的一项任务,我不允许复制任何代码。对于我来说,dijkstra算法实现起来非常复杂:-( – Markus 2013-04-04 11:10:19
感谢您为我投入这么多时间!!!您的实现工作正常!然而,我有一些问题或许可以回答:1.即使在阅读手册后, m没有真正意识到'nb_setarg'和'setarg'之间的区别,是不是真的知道'nb_setarg'和'setarg'之间的区别?如果回溯找到另一个解决方案,但是'nb_setarg'不会发生这种情况,用'setarg'取代Value?2.我无法确定为什么在你的算法中有一个'fail'和'true',你能解释一下它们的用途吗? – Markus 2013-04-04 17:10:52
这些是Prolog的特性.'fail'通过findPath产生下一个解决方案,但是在产生最后一个解决方案之后,它会失败,'true'将允许完成这个过程。参见 - > [控制谓词](http://www.swi-prolog.org/pldoc/doc_for?object=section%282,%274.8% 27,swi%28%27/doc/Manual/control.html%27%29%29)无关:我认为重复/ 0可以被删除编辑。 – CapelliC 2013-04-04 17:25:55