zoukankan      html  css  js  c++  java
  • 人员安排问题--搜索算法的剪支方法应用

    问题定义

           输入:

    • 人的集合P = {P1,P2,...,Pn},其中,P1<P2<...<Pn
    • 工作的集合J = {J1,J2,...,Jn},J是偏序集合,也就是说,J中某些元素之间存在序关系。
    • 矩阵[Cij],Cij表示工作Jj分配给Pi的代价。

           输出:

    • 每个人都被分配到某一工作,不同人分配到不同工作,且满足以下条件:如果F(Pi) ≤ F(Pj),那么Pi<Pj。其中,F:P→J,表示p被分配给工作j。
    • 矩阵[Xij],Xij = 1表示Jj分配给Pi,使得ΣXijCij最小。

    分析以及生成解空间

          定义1:J的拓扑序列<JK1,JK2,...JKn>。满足,如果 Ji≤Jj,那么J排在Jj

          命题1:如果P1→Jk1,P2→Jk2,..,Pn→Jkn是一个可能 解, 当且仅当Jk1,Jk2,...,Jkn必是一个J的拓朴排序的序列。

          证明1:显然,依据问题的定义可以直接证明得到。

          拓扑排序树问题

          输入:偏序集合J

          输出:J的拓扑序列树,即用树表示所有的拓扑排序序列<JK1,JK2,...JKn>。满足,如果 Ji≤Jj,那么J排在Jj

    输入: 偏序集合S, 树根root.
    输出: 由S的所有拓朴排序序列构成的树.
    生成树根root;
    选择偏序集中没有前序元素的所有元素, 作为root的子节点;
    For root的每个字节点v Do
         S=S-{v};
    把v作为根, 递归地处理S

          拓扑序列树的例子

    分支界限搜索方法

            该问题变为对拓扑序列树的最大权值序列的搜索问题。

            命题2,把代价矩阵某行(列)的各元素减去同一个 数, 不影响优化解的求解,同时,所有被减去元素的和 + 某一序列对于当前权值矩阵计算的和 =  该序列对于原权值矩阵计算的和,且将所有被减去元素的和定义为解的代价下界。

            证明2,该序列仅仅在权值矩阵的每一行(列)选取一个元素,也必会选取一个元素,那么,把代价矩阵某行(列)的各元素减去同一个数,并不会影响对于该行(列)元素的选取。

            技巧1,代价矩阵的每行(列)减去同一个数(该行或列的最小数), 使得每行和每列至少有一个零, 其余各元素非负。

            技巧1的意义,可以降低权值的分布范围以及提高了序列权值的下界,便于搜索算法里权值计算以及剪支。

           搜索算法可以定义为:

    • 建立根节点,其权值为解代价下界:技巧1中所有被减去元素的和。
    • 使用爬山法,,贪心求解出当前算法的某个代价较小的可行解,计算代价方法为:每产生一个节点,,其权值为加工后的代价矩阵对应元素 + 其父节点权值。
    • 当发现某个可行解时,遍历所有的解,在这一过程中,不断较低界限以及根据界限删去不可能是优化解的部分(剪支)。

  • 相关阅读:
    最短路径(Dijkstra和堆优化)
    最小生成树(prim和Kruskal)
    ac自动机(加强版)
    【敏捷】火星人敏捷开发手册- 教你怎么开会 然并卵知晓
    【敏捷】扑克牌估算
    向黄太吉学习线上营销模式
    黄太吉品牌创始人赫畅:创造下一个互联网奇迹
    吃煎饼思考人生:从黄太吉看商家的社会化营销
    月薪3000与月薪30000的文案区别
    聚美优品广告词和经典分析
  • 原文地址:https://www.cnblogs.com/zqybegin/p/13598677.html
Copyright © 2011-2022 走看看