You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Answer Set Programming的多目标点最短路径求解问题排查

ASP最短路径枚举问题分析与修正

原代码的核心问题

  • 目标偏差:原代码将所有选中边的总成本最小化,本质是找覆盖所有终点的边集的最小总代价,而非每个终点的单独最短路径。比如输出结果的总代价12是1->3+3->4+3->5的成本总和,但这不是单个终点的最短路径成本。
  • 路径定义缺陷:递归的path(X,Z)未限制无环,可能生成包含环路的无效路径。
  • 未实现路径枚举:仅输出一组满足总代价最小的边集,没有单独枚举每个终点的所有最短路径。

修正后的ASP代码

以下代码可实现从起点1到每个终点(3、4、5)的所有最短路径枚举,并输出每条路径的对应成本:

node(1..5).
edge(1,2,1).
edge(2,3,9).
edge(3,4,4).
edge(4,1,4).
edge(1,3,1).
edge(3,5,7).

start(1).
end(3).
end(4).
end(5).

% 计算起点到各节点的最短距离
dist(X,D) :- start(X), D=0.
{ dist(Y,D+W) } :- dist(X,D), edge(X,Y,W), not dist(Y,D') where D' <= D+W.
#minimize { D,X : dist(X,D), end(X) }.

% 枚举符合最短距离的无环路径片段
1{ path_step(X,Y) }1 :- start(X), edge(X,Y,W), dist(Y,D), dist(X,Dx), D = Dx + W.
1{ path_step(X,Y) }1 :- path_step(_,X), edge(X,Y,W), dist(Y,D), dist(X,Dx), D = Dx + W, not path_step(Y,_).

% 拼接完整路径(从起点到终点的无环路径)
path(P, X, Y) :- start(X), end(Y), path_step(X,Y), P = [X,Y].
path(P, X, Y) :- path(P1, X, Z), path_step(Z,Y), end(Y), not member(Y,P1), P = P1 ++ [Y].

% 计算每条路径的成本
path_cost(P, C) :- path(P, X, Y), C = #sum{ W : edge(A,B,W), next_to(A,B,P) }.
next_to(A,B,P) :- P = [_|T], member(B,T), index_of(P,A,I), index_of(P,B,I+1).
index_of([H|_], H, 1).
index_of([_|T], E, I) :- index_of(T,E,I1), I = I1 + 1.

% 展示结果
#show path/3.
#show path_cost/2.

代码说明

  1. 最短距离计算:通过dist/2谓词迭代计算起点到每个节点的最短距离,用#minimize确保结果为最优解。
  2. 无环路径枚举:path_step/2只选取符合最短距离的边,通过not path_step(Y,_)避免生成环路;path/3将路径片段拼接为完整的路径列表。
  3. 路径成本计算:next_to/3识别路径中相邻的节点对,path_cost/2累加对应边的权重得到单条路径的总成本。
  4. 结果输出:直接展示每条完整路径及其对应的成本。

运行结果示例

使用clingo运行修正后的代码,会输出所有最短路径及成本:

Answer: 1
path([1,3],1,3) path_cost([1,3],1) path([1,3,4],1,4) path_cost([1,3,4],5) path([1,3,5],1,5) path_cost([1,3,5],8)
OPTIMUM FOUND

对应每个终点的最短路径:

  • 到3:1->3,成本1
  • 到4:1->3->4,成本5
  • 到5:1->3->5,成本8

若存在多条同成本的最短路径,代码会自动枚举所有可能。

内容的提问来源于stack exchange,提问作者user16457964

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:15:55