最长路径A *,可接受的启发式算法和最优性

时间:2014-07-10 23:21:12

标签: algorithm a-star heuristics

我正在研究改进的A-Star算法。它试图找到最高加权的路径,而不是试图找到最短路径。

我有一些类,每个类都有一个唯一节点列表。每个节点都有自己的值。我试图确定每个类的最佳节点组合,以确定具有最大权重的组合或路径。为此,我将这些类视为一个树,每个级别包含一个类中的节点。

然后我使用A-Star或更具体地搜索这个树,我在搜索堆栈中搜索我的树。一旦探索了一个节点,它的子节点就会根据它们的权重(加上它们的祖先权重)加上可能的未来权重(我的启发式)按照排序顺序插入。然后选择具有最高值的堆栈顶部进行下一步搜索。

要做到这一点,我有一个过高估计的启发式;它永远不会低估最佳解决方案。

如果我正在寻找最高权重而不是最低权重,这种启发式是否可以接受,因此我的算法是最优的?

我还应该说我的算法目前正在运行,它的工作速度比粗暴强制所有可能的路径要快得多,我只是想知道我的解决方案是否是最优的。

PS:当前算法的FormalIsh定义。

设S = {S 1 ,S 2 ,...,S n }

并且每个S i 都有一组项目和一个NULL,表示未从该集合中选择的项目。

S i = {I 1 ,I 2 ,...,I m ,NULL}

此外,每个项目只存在于一个集合中,IE S i US j = S i + S j

每个项目,我 i 都有一个关联值,V i

问题是当求和得到最高值时,选择最多M个要约,每个要约一个。我将此选择称为Path,P i 。路径可以是完整的,这意味着它具有来自所有S的选择,或者它可以是部分的,其中仅包含x个提议。还有M.

此外,还存在一个函数IsCompatable(path),如果路径兼容,则返回true。路径是兼容的还是完全任意的。 Max值路径必须兼容。这就是为什么我不能轻易地从每一组中选择M个最大项目。

此外,每个集合都包含一个NULL项,因此无需从该集合中选择项目。

Trivial算法会创建一个搜索树并生成S中所有可能的项目组合,每条到树木的路径都称为路径。

令G(P)为部分路径的当前值(每个项目的总和值)。 设H(P)是未来路径的值的估计(启发式)。 H(P)=来自S中的Y S i 的Y项目的Y值。每个项目是S i 中具有最大值的项目,其中i> 1。 LEN(P)。 Y = M--部分路径P的当前长度。

要查找具有最大值的路径,我保留一个已排序的部分路径队列,按其值排序+可能的未来值,即G(P i )+ H(P I )。我通过添加S 1 中包含的路径来初始化此队列。

While the Queue is not empty or a path has not been found:
    p = Pop the path from the top of Q
    if p is Complete:
        A full path has been found
        return p
    find the possible children of p by adding an item to p from the next set.
    for child in Children:
        if IsCompatable(child):
            add child back to Q in sorted order on G(child) + H(child)

在那里,现在我的启发式是可以接受的吗?

问题描述

(这是为了使问题描述正式化而添加的。它是不完整的。)

考虑一个集合U,划分为不相交的子集S 1 ,...,S n

设f:U→ℝ是一个为U中的每个项目赋值的函数。

设V是U的所有子集的集合,每个S i 中最多包含一个项目,并且让V'⊂V为允许解的集合。 V'中的成员资格可以很容易地计算出来。

目标是找到最大化Σx∈P f(x)的解P∈V'。

1 个答案:

答案 0 :(得分:1)

A *不是为此而设计的。这样的启发式方法不起作用,因为你必须拒绝循环(否则没有解决方案),如果没有创建循环的目标路径,启发式方法总是会低估给定节点的距离......但是那里无法知道这一点。

没有已知良好的通用方法来解决这个问题,因为最长路径问题是NP难的,如汉密尔顿路径问题的减少所示(见Wikipedia)。