Prolog中的启发式搜索

Prolog中的启发式搜索,prolog,heuristics,Prolog,Heuristics,通过简单的深度优先搜索,我在Prolog中解决了桥牌和火炬之谜。现在我试图通过启发式搜索来解决这个问题。但是我不知道应该如何在Prolog中定义启发式 由于我在SWI Prolog手册和Google中没有找到有用的示例,您能帮我在Prolog中找到一些使用启发式搜索的示例吗?或者给我一个提示,让我开始试探性地思考这个问题 你可以看看我的答案,它使用沃恩斯多夫的启发法来解决大型骑士之旅难题:但是沃恩斯多夫的启发法(沃恩斯多夫规则)非常强大——它总是有效的,这在一般的启发法中并不典型 一般使用启发式

通过简单的深度优先搜索,我在Prolog中解决了桥牌和火炬之谜。现在我试图通过启发式搜索来解决这个问题。但是我不知道应该如何在Prolog中定义启发式


由于我在SWI Prolog手册和Google中没有找到有用的示例,您能帮我在Prolog中找到一些使用启发式搜索的示例吗?或者给我一个提示,让我开始试探性地思考这个问题

你可以看看我的答案,它使用沃恩斯多夫的启发法来解决大型骑士之旅难题:但是沃恩斯多夫的启发法(沃恩斯多夫规则)非常强大——它总是有效的,这在一般的启发法中并不典型

一般使用启发式的主要思想是,如果你有一个谓词列出了所有可能的移动,那么根据一些规则对它们进行排序:最短优先,最大优先,等等

A*(A star)是最常用的基于启发式的算法之一。只需谷歌“prolog中的a-star”即可获取大量信息


此外,约束逻辑编程一直使用启发式:第一次失败、最受约束、最大等。

你可以看看我的答案,它使用沃恩斯多夫的启发式来解决大骑士之旅难题:但是沃恩斯多夫的启发式(沃恩斯多夫规则)非常强-它总是有效,一般来说,这不是典型的启发式

一般使用启发式的主要思想是,如果你有一个谓词列出了所有可能的移动,那么根据一些规则对它们进行排序:最短优先,最大优先,等等

A*(A star)是最常用的基于启发式的算法之一。只需谷歌“prolog中的a-star”即可获取大量信息


此外,约束逻辑编程始终使用启发式:第一次失败、最受约束、最大等。

请查看与Logtalk一起分发的状态空间搜索示例(您可以使用多个后端Prolog编译器运行,包括SWI Prolog):


此示例定义了一个状态空间搜索框架,支持盲搜索和启发式搜索,并附带了几个示例,包括一个“桥梁”框架,它可能有助于与您自己的解决方案进行比较。您将在提供的一些示例中找到启发式的示例。此“搜索”示例还提供了评测支持,这有助于比较不同启发式和搜索策略的有效性。

请查看与Logtalk一起分发的状态空间搜索示例(您可以使用多个后端Prolog编译器运行,包括SWI Prolog):


此示例定义了一个状态空间搜索框架,支持盲搜索和启发式搜索,并附带了几个示例,包括一个“桥梁”框架,它可能有助于与您自己的解决方案进行比较。您将在提供的一些示例中找到启发式的示例。此“搜索”示例还提供了分析支持,这有助于比较不同启发式和搜索策略的有效性。

有关如何启发式思考此特定问题的一些想法,请参阅,例如。它描述了通过考虑那些考虑旅行时间最接近的人的情况来找到解决方案。例如,关于如何思考这个特定问题的一些想法,例如。它描述了通过考虑那些考虑旅行时间最接近的人的情况来找到解决方案。谢谢,不幸的是,我没有理解为什么启发函数是这样的:
<代码>启发((左,Lamp,右),启发):-< /代码>代码>(Lamp=left->
列表::最小值(左,启发式)
;列表::最大值(右,最大值),
列表::最小值(右,最小值),
启发式是最大值+最小值
).
请你解释一下好吗?注意在这个“桥”的公式中拼图你想让所有的人都在左边,最快的人在左边,动作越少,慢的人就越需要在右边等待。当灯在右边时,你通常想在一个动作中组合快的人和慢的人到左边。谢谢,不幸的是我没有“我不明白为什么启发式函数是这样的:
启发式((左,灯,右),启发式):-
(灯=左->
list::min(左,启发式)
;list::max(右,最大),
list::min(右,最小),
启发式是Max+Min
)。
请您解释一下好吗?注意在这个“桥”的公式中拼图你想让所有的人都在左边,最快的人在左边,就需要更少的动作让较慢的人在右边等待。当灯在右边时,你通常想在一个动作中组合更快和较慢的人到左边。