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
编辑: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