如何用简单的前向后向算法解决这个问题?

时间:2014-06-16 17:50:11

标签: algorithm dynamic-programming viterbi

我一直在玩forward-backward algorithm以找到最有效的(由成本函数决定,取决于当前状态与下一个状态的不同)从状态1到状态N的路径。如下图所示,每个州只有3个国家和2个节点可以看到问题的简短版本。我做了前向后向算法,找到了正常的最佳路径。图中的红色位是代码中前向传播位期间检查的路径。

现在有趣的是,我现在想要找到最好的3态长度路径(如前所述),但现在只知道第一个状态中的节点。其他4个现在是自由浮动的,可以认为是在任何国家(州2或州3)。我想知道你们是否对如何做到这一点有很好的了解。

图片:http://i.imgur.com/JrQ2tul.jpg enter image description here

注意:请记住,原始问题包括大约25个州和每个州100个节点。因此,您将了解状态1中大约100个节点的状态,但其他24 * 100节点是无状态的。在这种情况下,我想找到一个25状态长度的路径(最低成本)。

附录:有人指出一个更好的算法是维特比的算法。所以这里引入了更多变量的问题。你能解释一下这将如何实现?适用相同的规则,路径应从状态1中的一个节点(节点a或节点b)开始。此外,使用规范的成本函数在这种情况下没有意义,因为我们只有一个属性(节点的大小),但在实际问题中,我期待更多的属性。

A better picture of the problem.

1 个答案:

答案 0 :(得分:1)

Dijkstra算法的变体可能比前向后向算法更快,因为它不会同时分析所有节点。毕竟Dijkstra是一种DP算法。

让节点由

指定
Node:
   Predecessor : Node
   Total cost : Number      
   Visited nodes : Set of nodes  (e.g. a hash set or other performant set)

使用

初始化算法
open set : ordered (by total cost) set of nodes = set of possible start nodes (set visitedNodes to the one-element set with the current node)
           ( = {a, b} in your example)

然后执行算法:

do
    n := pop element from open set
    if(n.visitedNodes.count == stepTarget)
        we're done, backtrace the path from this node
    else
        for each n2 in available nodes
            if not n2 in n.visitedNodes
                push copy of n2 to open set (the same node might appear multiple times in the set):
                    .cost := n.totalCost + norm(n2 - n)
                    .visitedNodes := n.visitedNodes u { n2 }  //u = set union
                    .predecessor := n                    
        next
loop

如果计算标准很昂贵,您可能希望按需计算并将其存储在地图中。