使用迭代深化搜索陷入无限循环的Prolog
我正在用Prolog编写一个目标搜索代理。我有两个名为使用迭代深化搜索陷入无限循环的Prolog,prolog,depth-first-search,iterative-deepening,Prolog,Depth First Search,Iterative Deepening,我正在用Prolog编写一个目标搜索代理。我有两个名为search的谓词。一个问题是Type==explore,另一个问题是Type==gramb 注:使用的深度为常数=10。程序为我所有的测试用例提供了正确的路径,但是它们不是最短的,所以我想到了使用length(Actions,)它对于第一个搜索谓词非常有效,但是当我尝试为满足Type==gramb的后一个搜索谓词添加类似的内容时,它会进入无限循环/花费太长时间。 这就是我为此所做的: search(Problem,Actions):-
search
的谓词。一个问题是Type==explore
,另一个问题是Type==gramb
注:使用的深度为常数=10。程序为我所有的测试用例提供了正确的路径,但是它们不是最短的,所以我想到了使用
length(Actions,)
它对于第一个
搜索
谓词非常有效,但是当我尝试为满足Type==gramb
的后一个搜索谓词添加类似的内容时,它会进入无限循环/花费太长时间。
这就是我为此所做的:
search(Problem,Actions):-
Problem = [Goal-A-X,Y-Depth],
Goal = [Type,_,_],
Type == climb,
length(List,_),
depthfirst([A-X,Y],List,Depth),!,concat(List,[climb],Actions).
为什么会发生这种情况?以下是完整的代码:
search(Problem,Actions):-
Problem = [Goal-A-X,Y-Depth],
Goal = [Type,_,_],
Type == explore,
length(Actions,_),
depthfirst([A-X,Y],Actions,Depth),!.
search(Problem,Actions):-
Problem = [Goal-A-X,Y-Depth],
Goal = [Type,_,_],
Type == climb,
depthfirst([A-X,Y],List,Depth),concat(List,[climb],Actions).
depthfirst([A-X,Y],[],_):-
goal([_,Gx,Gy]),
Gx == X,
Gy == Y.
depthfirst([A-X,Y],[Action|Sol],Maxdepth):-
Maxdepth > 0,
s([A-X,Y],[A1-X1,Y1],Action),
Max1 is Maxdepth - 1,
depthfirst([A1-X1,Y1],Sol,Max1).
编辑:
好的,现在我知道它与指定的“深度”有关。我从
depthfirst
中删除了约束MaxDepth
,它现在正在工作。然而,最初的depthfirst是在给定深度内找到解决方案的,那么为什么它不能使用迭代深化-按照我指定的方式完成?ypu能显示您为导致无限循环的查询键入的内容吗?@mbrach我称之为简单搜索(问题,操作)在指定一个相关的目标并将其作为问题之后。问题=[Goal-A-X,Y-Depth],其中Goal是=[,Goal X坐标,Goal Y坐标],A是代理的四个角度之一,X,Y是坐标,Depth是第一次搜索应该达到的最大深度。depthfirst中使用的s()谓词是后继函数(链接到代理的知识库,在别处断言)。@mbrach这里有一些额外的信息:我试图通过编写以下代码来打印列表的长度:length(List,u),length(List,N),write(N),depthfirst([A-X,Y],List,Depth)
几乎可以不停地在屏幕上写下所有的数字。长度(List,N)
或长度(List,N)
只会生成长度为0,1,2。。。如果列表
是变量,则无限大。因此,这种行为是意料之中的。但是,如果您的谓词正在运行,我希望该构造允许您尝试长度逐渐变长的列表,直到找到解决方案。似乎您仍然必须为查询中的问题
键入特定的内容。如果在搜索(问题,操作)
查询中问题
和操作
都未绑定,那么类型==爬升
将始终失败,因为类型
将被解除绑定,如果一个参数绑定而另一个参数未绑定,=
将失败。因此,如果在你的问题陈述中,你展示了一个导致你需要帮助的问题的最简单的例子,这会有所帮助。