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

  • 相关阅读:
    年末反思
    Flink运行时架构
    Phoenix 启动报错:Error: ERROR 726 (43M10): Inconsistent namespace mapping properties. Cannot initiate connection as SYSTEM:CATALOG is found but client does not have phoenix.schema.
    Clickhouse学习
    Flink简单认识
    IDEA无法pull代码到本地,Can't Update No tracked branch configured for branch master or the branch doesn't exist.
    第1章 计算机系统漫游
    简单的 Shell 脚本入门教程
    开源≠免费 常见开源协议介绍
    MySQL 视图
  • 原文地址:https://www.cnblogs.com/zqybegin/p/13598677.html
Copyright © 2011-2022 走看看