Optimization 树上的增益最大化

Optimization 树上的增益最大化,optimization,tree,directed-acyclic-graphs,maximization,online-algorithm,Optimization,Tree,Directed Acyclic Graphs,Maximization,Online Algorithm,考虑一个树,其中每个节点都与系统状态关联,并包含在系统上执行的一系列操作 根节点是与系统原始状态关联的空节点。通过将n中包含的操作序列应用于原始系统状态,可以获得与节点n关联的状态。 节点n的操作序列是通过将新操作排队到父节点的操作序列来获得的 从一个节点移动到另一个节点(即,将新动作添加到动作序列)会产生增益,该增益附加到连接两个节点的边上 一些“数学”: 每个系统状态S都与一个值U(S) 与状态S关联的节点n获得的增益不能大于U(S)且小于0 如果n和m是树中的节点,n是m的父节点,U(n

考虑一个树,其中每个节点都与系统状态关联,并包含在系统上执行的一系列操作

根节点是与系统原始状态关联的空节点。通过将
n
中包含的操作序列应用于原始系统状态,可以获得与节点
n
关联的状态。 节点
n
的操作序列是通过将新操作排队到父节点的操作序列来获得的

从一个节点移动到另一个节点(即,将新动作添加到动作序列)会产生增益,该增益附加到连接两个节点的边上

一些“数学”:

  • 每个系统状态
    S
    都与一个值
    U(S)
  • 与状态
    S
    关联的节点
    n
    获得的增益不能大于
    U(S)
    且小于
    0
  • 如果
    n
    m
    是树中的节点,
    n
    m
    的父节点,
    U(n)-U(m)=g(n,m)
    ,即
    n
    m
    之间的边缘增益表示
    U
    n
    减少到
    m
请参见图中的示例。

我的目标是在树中找到保证最高增益的路径(路径的增益是通过求路径上所有边的增益之和来计算的):

请注意,树在开始时是未知的,因此不需要访问整个树(丢弃那些肯定不会得到最佳解决方案的路径)来找到最佳解决方案的解决方案将是最佳选择

注意:我在脱机模式下获得了一个类似问题的答案,即当图形已知时。然而,在这种情况下,树是未知的,因此像Bellman Ford这样的算法不会比brute fore方法(如建议的)更好。相反,我希望构建类似于回溯的东西,而无需构建整个树来找到最佳解决方案(分支和绑定?)


编辑:U(S)随着深度的增加而变得越来越小。

正如您所注意到的,分支和边界可以用来解决您的问题。只需扩展看起来最有希望的节点,直到找到完整的解决方案,同时跟踪最著名的解决方案。如果一个节点在该过程中的U(S)值低于最知名的解决方案,只需跳过它即可。当您没有更多的节点时,就完成了

下面是一个算法:

pending_nodes <- (root)
best_solution <- nothing

while pending_nodes is not empty
    Drop the node n from pending_nodes having the highest U(n) + gain(n)

    if n is a leaf
        if best_solution = nothing
            best_solution <- n
        else if gain( best_solution ) < gain( n )
            best_solution <- n
        end if
    else
        if best_solution ≠ nothing
            if U(n) + gain(n) < gain(best_solution)
                stop. best_solution is the best
            end if
        end if

        append the children of n to pending_nodes
    end if
end while

pending_节点为什么要根据U(n)(即节点n可以达到的最高增益值)选择节点?由于U(n)随着节点深度的增加而变得越来越小,因此选择具有最高U(n)的节点将始终选择第一级的节点,然后选择叶。这将带来一个暴力解决方案(探索整棵树)。@Eleanore我将U(n)理解为从n可以达到的最佳解决方案的上界(即n以下根和叶之间路径长度的上界)。再读一遍你的问题,它应该是U(n)+增益(n),不是吗?假设n和m是树中的两个节点,n是m的父节点。然后,n和m之间的增益可以如下获得:增益=U(n)-U(m)。因此,可以将U(n)视为从n输出的边的增益的上界。这是因为U(m)不能大于U(n),因为U(n)随着深度的增加变得越来越小。实际上,由于这种关系,最大化增益等于最小化U(n)。因此,它应该通过最大化它来对解决方案作出贡献吗?此外,由于上界U(n)对于作为m的子节点的所有节点n是相等的,因此数量增益(m)+U(n)对于作为m的子节点的所有节点都是相等的。怎么可能从中选出最好的呢?
pending_nodes <- (root)
best_solution <- nothing

while pending_nodes is not empty
    Drop the node n from pending_nodes having the highest U(n) + gain(n)

    if n is a leaf
        if best_solution = nothing
            best_solution <- n
        else if gain( best_solution ) < gain( n )
            best_solution <- n
        end if
    else
        if best_solution ≠ nothing
            if U(n) + gain(n) < gain(best_solution)
                stop. best_solution is the best
            end if
        end if

        append the children of n to pending_nodes
    end if
end while