我正在尝试创建一个社交图,我必须编写一些 Prolog 以获得最小和最强的路径。
我的知识库只有以下语句:
边(源、目的地、权重)
例如:(约翰,玛丽,2)。
权重现在只能是 3:
1 - 朋友 2- 密友 3 - 家人
这是我的最小路径代码(权重较小)。
findapath(X, Y, W, [X,Y], _) :- edge(X, Y, W).
findapath(X, Y, W, [X|P], V) :- \+ member(X, V),
edge(X, Z, W1),
findapath(Z, Y, W2, P, [X|V]),
W is W1 + W2.
:-dynamic(solution/2).
findminpath(X, Y, W, P) :- \+ solution(_, _),
findapath(X, Y, W1, P1, []),
assertz(solution(W1, P1)),
!,
findminpath(X,Y,W,P).
findminpath(X, Y, _, _) :- findapath(X, Y, W1, P1, []),
solution(W2, P2),
W1 < W2,
retract(solution(W2, P2)),
asserta(solution(W1, P1)),
fail.
findminpath(_, _, W, P) :- solution(W,P), retract(solution(W,P)).
如何包含一个变量来计算经过的路径数量,然后使用它来获得最强的路径?
最强路径是路径权重/经过的路径数。
例如,
重量 = 8 N 行进路径 = 3
8/3 = 2.67 强度
这意味着我和我的目的地之间有 3 个人(这是一个社交图),他们的加权和是 8。
但在这种情况下
重量 = 7 N 行进路径 = 7
这将是最小的路径,对吧?是的,因为它是 7 和 7 < 8。但是,这不是最强的路径,因为 7/7 = 1,这意味着我和目的地之间可能有很多人不像另一个那样靠近我小路。
我该怎么做?