如何获得最强路径prolog?

如何获得最强路径prolog?,prolog,graph-theory,shortest-path,social,Prolog,Graph Theory,Shortest Path,Social,我正在尝试创建一个社交图,我必须编写一些序言,以获得最小和最强的路径 我的知识库只有以下陈述: 边缘(源、目标、重量) 例:(约翰,玛丽,2岁) 目前重量只能为3: 1-朋友 2-密友 3-家庭 下面是我的代码,它指向最小路径(权重较小) findapath(X,Y,W,[X,Y],u):-edge(X,Y,W)。 findapath(X,Y,W,[X | P],V):-\+成员(X,V), 边缘(X,Z,W1), findapath(Z,Y,W2,P,[X|V]), W是W1+W2。 :-动态

我正在尝试创建一个社交图,我必须编写一些序言,以获得最小和最强的路径

我的知识库只有以下陈述:

边缘(源、目标、重量)

例:(约翰,玛丽,2岁)

目前重量只能为3:

1-朋友 2-密友 3-家庭

下面是我的代码,它指向最小路径(权重较小)

findapath(X,Y,W,[X,Y],u):-edge(X,Y,W)。
findapath(X,Y,W,[X | P],V):-\+成员(X,V),
边缘(X,Z,W1),
findapath(Z,Y,W2,P,[X|V]),
W是W1+W2。
:-动态(解决方案/2)。
findminpath(X,Y,W,P):-\+溶液(u,u),
FindPath(X,Y,W1,P1,[]),
assertz(溶液(W1,P1)),
!,
findminpath(X,Y,W,P)。
findminpath(X,Y,_u,u):-FindPath(X,Y,W1,P1,[]),和,
溶液(W2,P2),
W1
如何包含一个变量来计算经过的路径数,然后使用该变量来获得最强的路径

最强大的路径是路径权重/行进的路径数

那么比如说,

重量=8 N条路径=3

8/3=2.67强度

这意味着在我和目的地之间有3个人(这是一个社交图),他们的加权和是8

但在这种情况下

重量=7 N条路径=7

这将是最小路径,对吗?是的,因为它是7和7<8。然而,这并不是最强的路径,因为7/7=1,这意味着我可能有很多人在我和我的目的地之间,而不是像其他路径那样靠近我


我该怎么做?

如果您的Prolog系统有
keysort/2
findall/3
,您可以避免 资产/收回。也就是说,您可以首先定义基于强度的 关于体重,我是如何理解的:

% path_list_and_weight(+Node,+Node,-Nodes,-Integer)
path_list_and_weight(...) :- ...

% path_list_and_neg_strength(+Node,+Node,-Nodes,-Float)
path_list_and_neg_strength(X, Y, L, S) :-
    path_list_and_weight(X, Y, L, W),
    length(L, N),
    S is -W/N.
然后用它们的强度枚举所有路径列表 对它进行键排序。我将强度定义为负值, 因此,keysort给了我最大的力量:

% max_path_list_and_strength(+Node,+Node,-Nodes,-Float)
max_path_list_and_strength(X, Y, L, S) :-
    findall(T-M, path_list_and_neg_strength(X, Y, T, M), H),
    keysort(H, [J-L|_]),
    S is -J.
我猜上面这些在实践中对一些图不起作用, 当出现组合爆炸时,以及
path\u list\u和\u neg\u strength/4
将有太多的重做。在这种情况下,可能是基于表格的 解决办法更好


再见

使用assert/retract进行推断是不好的设计,请尽量避免使用它。。。
% max_path_list_and_strength(+Node,+Node,-Nodes,-Float)
max_path_list_and_strength(X, Y, L, S) :-
    findall(T-M, path_list_and_neg_strength(X, Y, T, M), H),
    keysort(H, [J-L|_]),
    S is -J.