2

我正在尝试创建一个社交图,我必须编写一些 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,这意味着我和目的地之间可能有很多人不像另一个那样靠近我小路。

我该怎么做?

4

0 回答 0