算法设计与分析(王佳)07分支限界法.pptVIP

  • 18
  • 0
  • 约1.65万字
  • 约 60页
  • 2017-05-08 发布于浙江
  • 举报

算法设计与分析(王佳)07分支限界法.ppt

* * * * * * * * * * * * * * * 9.3 装载问题 3. 算法的改进 // 检查左儿子结点 int wt = ew + w[i]; if (wt = c) { // 可行结点 if (wt bestw) bestw = wt; // 加入活结点队列 if (i n) queue.put(new Integer(wt)); } 提前更新bestw // 检查右儿子结点 if (ew + r bestw i n) // 可能含最优解 queue.put(new Integer(ew)); ew=((Integer)queue.remove()) .intValue(); // 取下一扩展结点 右儿子剪枝 9.3 装载问题 4. 构造最优解 为了在算法结束后能方便地构造出与最优值相应的最优解,算法必须存储相应子集树中从活结点到根结点的路径。为此目的,可在每个结点处设置指向其父结点的指针,并设置左、右儿子标志。 private static class QNode { QNode parent; // 父结点 boolean leftChild; // 左儿子标志 int weight; // 结点所相应的载重量 9.3 装载问题 找到最优值后,可以根据parent回溯到根节点,找到最优解。 // 构造当前最优解 for (int j = n; j 0; j--) { bestx[j] = (e.leftChild) ? 1 : 0; e = e.parent; } 9.3 装载问题 5. 优先队列式分支限界法 解装载问题的优先队列式分支限界法用最大优先队列存储活结点表。活结点x在优先队列中的优先级定义为从根结点到结点x的路径所相应的载重量再加上剩余集装箱的重量之和。 优先队列中优先级最大的活结点成为下一个扩展结点。以结点x为根的子树中所有结点相应的路径的载重量不超过它的优先级。子集树中叶结点所相应的载重量与其优先级相同。 在优先队列式分支限界法中,一旦有一个叶结点成为当前扩展结点,则可以断言该叶结点所相应的解即为最优解。此时可终止算法。 9.4 布线问题 算法的思想 解此问题的队列式分支限界法从起始位置a开始将它作为第一个扩展结点。与该扩展结点相邻并且可达的方格成为可行结点被加入到活结点队列中,并且将这些方格标记为1,即从起始方格a到这些方格的距离为1。 接着,算法从活结点队列中取出队首结点作为下一个扩展结点,并将与当前扩展结点相邻且未标记过的方格标记为2,并存入活结点队列。这个过程一直继续到算法搜索到目标方格b或活结点队列为空时为止。即加入剪枝的广度优先搜索。 9.4 布线问题 Position [] offset = new Position [4]; offset[0] = new Position(0, 1); // 右 offset[1] = new Position(1, 0); // 下 offset[2] = new Position(0, -1); // 左 offset[3] = new Position(-1, 0); // 上 定义移动方向的相对位移 for (int i = 0; i = size + 1; i++) { grid[0][i] = grid[size + 1][i] = 1; // 顶部和底部 grid[i][0] = grid[i][size + 1] = 1; // 左翼和右翼 } 设置边界的围墙 9.4 布线问题 for (int i = 0; i numOfNbrs; i++) { nbr.row = here.row + offset[i].row; nbr.col = here.col + offset[i].col; if (grid[nbr.row][nbr.col] == 0) { // 该方格未标记 grid[nbr.row][nbr.col] = grid[here.row][h

文档评论(0)

1亿VIP精品文档

相关文档