如何获得最强路径prolog?
我正在尝试创建一个社交图,我必须编写一些序言,以获得最小和最强的路径 我的知识库只有以下陈述: 边缘(源、目标、重量) 例:(约翰,玛丽,2岁) 目前重量只能为3: 1-朋友 2-密友 3-家庭 下面是我的代码,它指向最小路径(权重较小)如何获得最强路径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。 :-动态
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.