zoukankan      html  css  js  c++  java
  • 分支界限法的应用

    一. 人员安排问题

    • 问题定义:

    -输入:

    人员:P={ P1,P2…Pn} ; 工作:J={J1,J2…Jn} ; 矩阵[Cij]:表示Pi完成Jj的代价

    限制条件:P是全序集,J是偏序集,要优先把高难度的任务分配给业务能力强的人员(即:分配任务的一 一映射函数f:若f(Pi) < f(Pj),则 Pi < Pj )

    -输出:

    [Xij]:Xij=1表示Pi完成Pj工作,否则Xij=0,使∑CijXij最小

    • 算法设计

    若无限制条件:最大二分匹配问题:匈牙利算法/最大流的FF算法

    有限制条件:搜索的问题

    • 如何转化成图的搜索问题

    问题解空间:若 P1~>Jk1 , P2~>Jk2 ,…Pn~>Jkn , 则Jk1,Jk2,Jk3满足拓扑序

    将可行解空间表示为拓扑树。

    该问题的拓扑树如下

                         

     树高 i 表示Pi,结点 j 表示任务Jj

    • 算法设计

    (1)得到拓扑序列树

          输入:偏序集合S,树根root
          输出:由S的所有拓扑排序序列构成的树
          1. 生成树根root
          2. 选择偏序集合中没有前驱元素的所有元素,作为root的子节点
          3. 对于root的每一个子节点v Do
          4.       S = S - {v}
          5.       把v作为根,递归地处理S。

    (2)分支界限求解

    a. 得到每个步骤的尽可能大的下界:维护每个步骤尽可能大的下界的一个优先队列,有利于更快的剪枝

    将矩阵[Cij]每行、列减去最小值,将减去的最小值求和得到初始问题的下界

    b. 得到优化解的上界:用爬山法搜索得到一个可行解,作为优化解的上界

    每次比较当前步骤的下界优化解的上界来进行剪枝

    c. 更新最优解的上界,重复步骤b,直到所有分支被剪去

    二. 旅行商问题

    • 问题定义:

    输入:带权无环无向连通图G=(V,E)

    输出:一条由任意节点开始,经过每个节点一次,最后返回开始节点的路径,该路径的代价最小。

    • 算法设计

                          (1)可以使用上述问题中由每一步最大下界整体上界的方法剪枝

    上述方法每次只能剪去1/n的分支,在这里我们给出一种更优的思路:

    改变解空间的定义方法,将问题的解空间表示成二叉树,这样可以一次剪去1/2的分支

                        (2)使用二叉树的分支界限法

    a.预处理:[Xij] :表示i~>j的权值,二叉树T:结点表示路径,左子树表示包含该路径的解空间,右子树表示不包含该路径的解空间

    b.剪枝技巧:1. [Xij]每行列减去最小值得到初始问题的下界

                         2. 结点表示路径的选取要使左右子树差距更大,利于剪枝

                                         设最优选取的路径为ij,满足ij最小,且im + kj最大(矩阵点ij对应行列最小值的和最大)

    c. 分支界限过程

    左子树:贪心选择的局部最优解(获得问题的上界)

    右子树:每一步骤对应的最大下界

    d. 不断剪枝更新上界,直到分支为0,问题上界即为所求

    注意:保证每次的上界是一个可行解(避免出现环)

     

     

  • 相关阅读:
    自执行匿名函数
    jQuery Ajax 实例 ($.ajax、$.post、$.get)
    iframe的滚动条问题:显示/隐藏滚动条
    选择器的整理
    html标记
    Axure RP
    苹果官方人机交互指南中明确定义了应用中需要包括的图标和启动画面图片
    tableview_nav 动画效果
    WebView加载HTML图片大小自适应与文章自动换行
    iOS App创建桌面快捷方式
  • 原文地址:https://www.cnblogs.com/duanshuai/p/13183564.html
Copyright © 2011-2022 走看看