ソーシャル グラフを作成しようとしていますが、最小かつ最強のパスを取得するために 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 であるため、これは最強のパスではありません。これはおそらく、自分と目的地の間に、他の人ほど近くにいない人がたくさんいたことを意味します。道。
どうすればいいですか?