gpt4 book ai didi

prolog - 如何获得最强的路径序言?

转载 作者:行者123 更新时间:2023-12-05 01:12:23 26 4
gpt4 key购买 nike

我正在尝试创建社交图,并且必须编写一些Prolog才能获得最小和最强的路径。

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

边缘(来源,目的地,重量)

范例:(john,mary,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,这意味着我和目的地之间可能有很多人与我之间的距离不那么近路径。

我该怎么做?

最佳答案

如果您的Prolog系统具有keysort/2findall/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_list_and_neg_strength/4
重做太多。在这种情况下,可能基于
解决方案更好。

再见

关于prolog - 如何获得最强的路径序言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14056963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com