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