Prolog求解图最少连接数路径 现有代码运行结果不符问题咨询
问题排查与修复方案
错误根源
你修改后的代码核心问题出在路径基础子句的变量冲突:
在path(X,Y,[X,Y],L)子句中,你先执行了edge(X,Y,L),这一步会直接将L绑定为对应边的权重值(比如测试用例中1和2的边权重为10),后续执行L is 1时会因为10≠1直接匹配失败,导致直接连接的路径完全无法被检索到,只能匹配到两步的中转路径,才会出现不符合预期的结果。
修复后的完整代码
修复思路是将边的权重参数和你要统计的连接数参数完全分离,不需要用到权重时直接忽略该参数即可:
% 测试知识库 edge(1,2,10). edge(1,3,1). edge(3,2,1). % 路径谓词:参数依次为 起点、终点、路径列表、连接数 path(X,Y,[X,Y],1):- edge(X,Y,_). % 忽略权重参数,仅判断边是否存在 path(X,Y,[X|W],L):- edge(X,Z,_), path(Z,Y,W,L2), L is L2 + 1. % 最少连接数路径查询谓词 shortestPath(X,X,[X,X],0):- !. shortestPath(X,Y,MinP,MinD):- findall([L,P],path(X,Y,P,L),Set), sort(Set,Sorted), Sorted = [[MinD,MinP]|_].
运行验证
调用shortestPath(1,2,X,Y)将返回符合预期的结果:
X = [1,2]Y = 1
额外优化建议
如果你的图存在环结构,可以给路径谓词增加已访问节点校验,避免无限递归:
% 内部递归谓词:增加已访问节点列表参数 path(X,Y,Visited,[X,Y],1):- edge(X,Y,_), \+ member(Y, Visited). path(X,Y,Visited,[X|W],L):- edge(X,Z,_), \+ member(Z, Visited), path(Z,Y,[Z|Visited],W,L2), L is L2 + 1. % 对外调用入口 path(X,Y,P,L) :- path(X,Y,[X],P,L).
内容的提问来源于stack exchange,提问作者Emanuel Salvadinho
相关产品推荐
相关产品推荐

