考虑一棵树,其中每个节点都与系统状态相关联,并包含在系统上执行的一系列操作。
根是与系统的原始状态相关联的空节点。与节点关联的状态n
是通过将包含在原始系统状态中的动作序列应用n
到原始系统状态而获得的。节点的动作序列n
是通过将新动作排队到父动作序列来获得的。
从一个节点移动到另一个节点(即,将一个新动作添加到动作序列中)会产生一个增益,该增益附加到连接两个节点的边上。
一些“数学”:
- 每个系统状态
S
都与一个值相关联U(S)
n
与状态相关的节点所获得的增益S
不能大于U(S)
和小于0
- 如果
n
和m
是树中的节点 并且n
是 , 的父节点m
,即和U(n) - U(m) = g(n,m)
之间的边上的增益表示从到的减少n
m
U
n
m
请参见图中的示例。
我的目标是在树中找到保证最高增益的路径(其中路径的增益是通过将路径上边缘的所有增益相加来计算的):
Path* = arg max_{path} (sum g(n,m), for each adjacent n,m in path)
请注意,树在一开始是未知的,因此不需要访问整个树的解决方案(丢弃肯定不会带来最佳解决方案的那些路径)以找到最佳解决方案将是最佳选择。
注意:我在这里和这里获得了一个答案,用于离线模式下的类似问题,即当图形已知时。但是,在这种情况下,树是未知的,因此诸如 Bellman-Ford 之类的算法的性能不会比蛮力方法(如建议的那样)好。相反,我想构建类似于回溯的东西,而不是构建整个树来找到最佳解决方案(分支和绑定?)。
编辑:随着深度的增加,U(S) 变得越来越小。