C++ DFID(部门第一次迭代加深)与IDA*(迭代加深A*)

C++ DFID(部门第一次迭代加深)与IDA*(迭代加深A*),c++,algorithm,artificial-intelligence,solver,C++,Algorithm,Artificial Intelligence,Solver,我想知道这两种算法的优缺点是什么。我想写C++解决,但我不确定应该使用哪个(IDA或DFID)算法。 我找到的最好的文章是,但它似乎太旧了--'93年。有更新的吗 我想艾达会更好,但是?还有其他想法吗 任何想法和信息都会有帮助 谢谢!(: 编辑:一些关于IDA*的好文章和算法的好解释 EDIT2:或该游戏的一些好的启发式函数?我不知道如何想出一些:查看第3章和第4章,并意识到IDA*很难正确编程。您可能希望尝试递归最佳优先搜索(RBFS),也由R&N描述,或简单的旧A*。后者可以使用 IIRC,

我想知道这两种算法的优缺点是什么。我想写C++解决,但我不确定应该使用哪个(IDA或DFID)算法。 我找到的最好的文章是,但它似乎太旧了--'93年。有更新的吗

我想艾达会更好,但是?还有其他想法吗

任何想法和信息都会有帮助

谢谢!(:

编辑:一些关于IDA*的好文章和算法的好解释

EDIT2:或该游戏的一些好的启发式函数?我不知道如何想出一些:

查看第3章和第4章,并意识到IDA*很难正确编程。您可能希望尝试递归最佳优先搜索(RBFS),也由R&N描述,或简单的旧A*。后者可以使用

IIRC,R&N在第一版中描述了IDA*,然后在第二版中将其替换为RBF。我还没有看过第三版


关于你的第二次编辑,我没有研究过这个游戏,但是推导启发式的一个很好的过程是放松问题。你去掉游戏规则,直到你推导出一个启发式易于表达和实现的版本(并且计算成本低)或者,采用自下而上的方法,检查主要规则,看看哪一条允许简单的启发式,然后尝试一下,并根据需要添加其他规则。

Russel&Norvig的书是这些算法的优秀参考书,我会给larsmans一个虚拟的五分,因为他提出了这个建议;但是我不同意IDA*在任何方面有任何价值编程要比*困难得多。我曾经为一个项目做过这样的工作,在这个项目中,我必须编写一个AI来解决一个滑动块难题——一个熟悉的问题,即拥有一个N x N的编号瓷砖网格,并使用单个可用空间来滑动瓷砖,直到它们按升序排列

回顾:

F(n) = g(n) + h(n).

TotalCost = PathCost + Heuristic.
g(n)=路径成本,从初始状态到当前状态的距离

h(n)=启发式,从当前状态到最终状态的成本估算。要成为可接受的启发式(从而确保A*的最优性),在任何情况下都不能高估成本

请记住,迭代深化A*只是A*,对允许遍历的节点的F值有一个限制。该
FLimit
随着每次外部迭代而增加;每次迭代都在深化搜索


实现A*和IDA*来解决前面提到的滑块难题。您可以看到,我使用了一个带有自定义比较器的
std::priority_队列
来存储队列中按F值排序的谜题状态。您还将注意到,A*和IDA*之间的唯一区别是添加了一个
FLimit
check和一个外部循环增加这个
FLimit
。我希望这有助于阐明这个问题。

DFID只是IDA*的一个特例,其中启发式函数是常数0;换句话说,它没有引入启发式的规定。如果问题不够小,不使用启发式就可以解决,那么EEMS,你别无选择,只能使用IDA*(或者某个A*族的其他成员)。换句话说,IDA *并不那么难:AIMA的作者提供的只是LISP代码的大约一半;我想象C++的实现不应该超过两倍。(:但如果我没有错的话,IDA*似乎更适合这个游戏。由于我的研究,我一直相信这是解决这个问题的正确算法。正如你所说的,这很难,我希望有人能在相反的方面说服我……/:)@基里尔:你试过实现任何搜索算法吗?为这类任务选择正确的算法并不是一门精确的科学:你必须尝试几种算法,直到找到一种运行良好的算法。也许你只需要一个简单的算法。啊,你是对的。我没有尝试过。但我没有太多时间进行测试,我只是想知道是否有这类游戏的推荐算法。AddEmUp看起来(有点)像8字谜问题,使用IDA*可以最有效地解决。但我同意你的看法。如果不指定启发式,使用IDA*最有效地解决问题“仍然没有多大意义。我建议尝试使用IDS(或你的来源称之为DFID)在越来越困难的情况下,直到出现故障,然后在出现故障时实施A*或RBF。在实施搜索时有很多选择,这就是为什么还没有人为其编写库的原因。非常感谢您提供的信息和帮助(:感谢。+1感谢您的关注、解释和建议R&N。10qIsn DFID不只是IDA*的一个特例,其中启发式函数始终为0?所以本质上您是在问是否应该使用启发式函数。@怀远:这是一个特例,但没有任何有用的意义。啊,非常感谢您的回答!我一定会告诉您se IDA*+1来自我。非常感谢,这确实帮助了我(:已接受。@Aphex在您的实现中,a*和IDA*的最终迭代使用相同的空间。最初提出的实现(请参阅),作者在IDA*的每个迭代中使用深度优先搜索,其优点是不需要存储a*的打开和关闭列表(DFS期间有一个访问列表,如果图形不是树,则需要存储该列表)。这就是IDA*的思想;您可能会在某个深度(希望是较浅的)内找到解决方案,而无需遍历更深的节点。您和那篇文章描述的似乎是IDDFS-迭代深化深度优先搜索(也称为DFID)-不是A*。