a z e( 1 , 1 )为 1。从这个位置,能移动到( 1 , 2 )或( 2 , 1 )两个位置。对于本例,两种移动都是可
行的,因为在每一个位置都有一个值 0。假定选择移动到( 1 , 2 ),m a z e( 1 , 2 )被置为 1 以避免
再次经过该点。迷宫当前状态如图 16-3b 所示。这时有两个活节点(1,1) (1,2)。( 1 , 2 )成为 E-节
点。
在图 1 6 - 1 中从当前 E-节点开始有 3 个可能的移动,其中两个是不可行的,因为迷宫在这
些位置上的值为 1。唯一可行的移动是( 1 , 3 )。移动到这个位置,并置 m a z e( 1 , 3 )为 1 以避免
再次经过该点,此时迷宫状态为 1 6 - 3 c。图 1 6 - 1 中,从( 1 , 3 )出发有两个可能的移动,但没
有一个是可行的。所以 E-节点( 1 , 3 )死亡,回溯到最近被检查的活节点( 1 , 2 )。在这个位置也
没有可行的移动,故这个节点也死亡了。唯一留下的活节点是( 1 , 1 )。这个节点再次变为 E-节
点,它可移动到( 2 , 1 )。现在活节点为( 1 , 1 ),( 2 , 1 )。继续下去,能到达点( 3 , 3 )。此时,
活节点表为( 1 , 1 ),( 2 , 1 ),( 3 , 1 ),( 3 , 2 ),( 3 , 3 ),这即是到达出口的路径。
程序 5 - 1 3 是一个在迷宫中寻找路径的回溯算法。
例 4-2 [0/1 背包问题] 考察如下背包问题:n= 3,w= [ 2 0 , 1 5 , 1 5 ],p= [ 4 0 , 2 5 , 2 5 ]且
c= 3 0。从根节点开始搜索图 1 6 - 2 中的树。根节点是当前唯一的活节点,也是 E-节点,从这
里能够移动到 B 或 C 点。假设移动到 B,则活节点为 A 和 B。B 是当前 E-节点。在节点 B,剩
下的容量 r 为 1 0,而收益 c p 为 4 0。从 B 点,能移动到 D 或 E。移到 D 是不可行的,因为移到
D 所需的容量 w2 为 1 5。到 E 的移动是可行的,因为在这个移动中没有占用任何容量。E 变成新
的 E-节点。这时活节点为 A , B , E。在节点 E,r= 1 0,c p= 4 0。从 E,有两种可能移动(到 J
和 K),到 J 的移动是不可行的,而到 K 的移动是可行的。节点 K 变成了新的 E-节点。因为 K
是一个叶子,所以得到一个可行的解。这个解的收益为 c p= 4 0。x 的值由从根到 K 的路径来决
定。这个路径( A , B , E , K)也是此时的活节点序列。既然不能进一步扩充 K,K 节点死亡,
回溯到 E,而 E 也不能进一步扩充,它也死亡了。接着,回溯到 B,它也死亡了,A 再次变为
E-节点。它可被进一步扩充,到达节点 C。此时 r= 3 0,c p= 0。从 C 点能够移动到 F 或 G。假
定移动到 F。F 变为新的 E-节点并且活节点为 A, C,F。在 F,r= 1 5,c p= 2 5。从 F 点,能移动
到 L 或 M。假定移动到 L。此时 r= 0,c p= 5 0。既然 L 是一个叶节点,它表示了一个比目前找
到的最优解(即节点 K)更好的可行解,我们把这个解作为最优解。节点 L 死亡,回溯到节点
F。继续下去,搜索整棵树。在搜索期间发现的最优解即为最后的解。
例 4-3 [旅行商问题] 在这个问题中,给出一个 n 顶点网络(有向或无向),要求找出一个
包含所有 n 个顶点的具有最小耗费的环路。任何一个包含网络中所有 n 个顶点的环路被称作一
个旅行(t o u r)。在旅行商问题中,要设法找到一条最小耗费的旅行。
图 1 6 - 4 给出了一个四顶点网络。在这个网络中,一些旅行如下: 1 , 2 , 4 , 3 , 1;1 , 3 , 2 ,
4 , 1 和 1 , 4 , 3 , 2 , 1。旅行 2 , 4 , 3 , 1 , 2;4 , 3 , 1 , 2 , 4 和 3 , 1 , 2 , 4 , 3 和旅行 1 , 2 , 4 , 3 , 1 一
样。而旅行 1 , 3 , 4 , 2 , 1 是旅行 1 , 2 , 4 , 3 , 1 的“逆”。旅行 1 , 2 , 4 , 3 , 1 的耗费为 6 6;而 1 , 3 ,
2 , 4 , 1 的耗费为 2 5;1 , 4 , 3 , 2 , 1 为 5 9。故 1 , 3 , 2 , 4 , 1 是该网络中最小耗费的旅行。
顾名思义,旅行商问题可被用来模拟现实生活中旅行商所要旅行的地区问题。顶点表示旅行
商所要旅行的城市(包括起点)。边的耗费给出了在两个城市旅行所需的时间(或花费)。旅
行表示当旅行商游览了所有城市再回到出发点时所走的路线。
旅行商问题还可用来模拟其他问题。假定要在一个金属薄片或印刷电路板上钻许多孔。孔
的位置已知。这些孔由一个机器钻头来钻,它从起始位置开始,移动到每一个钻孔位置钻孔,
然后回到起始位置。总共花的时间是钻所有孔的时间与钻头移动的时间。钻所有孔所需的时间
独立于钻孔顺序。然而,钻头移动时间是钻头移动距离的函数。因此,希望找到最短的移动路
径。
另有一个例子,考察一个批量生产的环境,其中有一个特殊的机器可用来生产 n 个不同的
产品。利用一个生产循环不断地生产这些产品。在一个循环中,所有 n 个产品被顺序生产出来,
评论3
最新资源