指派问题是一种特殊的整数规划问题。有一定数量的任务和同等数量的人,每个人都可以完成任务,但花费的时间成本不同,所以需要找到一种指派方式,让总成本最低。这类问题建立的模型就是指派问题模型。

指派问题是0-1整数规划的一种,决策变量x_ij取1时,第i个人完成第j项工作,花费的成本是c_ij,否则决策变量x_ij取0。匈牙利解法是用来求解指派问题的常用方法。

十六、指派问题与求解

在一个实际的指派问题中,第i个人完成第j项任务时花费的成本是c_ij,那么n个人和n项任务一一组合,就会得到n²个成本,将其列成矩阵,就得到指派问题的系数矩阵:系数矩阵的一般形式,每一个元素都是成本数值

假设有4项工作等待4个人完成,系数矩阵就是4*4的,比如这样的系数矩阵:

这代表第一个人完成第一项工作的成本是1、完成第二项工作的成本是3,第二个人完成第一项工作的成本是2……等等。如果我们现在提出一个指派方案,如第一个人完成第一项工作,第二个人完成第二项工作,第三个人完成第三项工作,第四个人完成第四项工作,那就相当于提出了一个可行解:c_11=1,c_22=3,c_33=8,c_44=1

可以发现,为了使每一项工作都有人完成,取为1的四个变量必须位于不同行列。这种指派方案是可行的,但不是最优的,可以取到成本更低的方案,只需取x13=x22=x31=x44=1就能得到一组更优的解(12)。匈牙利解法就是用来获得最优解的方法。

下面以一道题作为例子,系数矩阵如下:这是一个五人完成五项任务的成本系数矩阵

匈牙利解法的第一步是,对系数矩阵进行化简。这里用到的原理是,如果一项工作的完成成本对于所有人都增加或者减少同一个数值,那么最优指派方案不变;如果一个人完成所有事的成本都增加或者减少同一个数值,最优指派方案仍不变。利用这一点,可以得知,让系数矩阵一行或一列中所有数同时减去一个数,不会改变最优解。所以我们可以先对系数矩阵每一行都减去行内最小值,再对每一列都减去列内最小值,这样,每一行每一列中一定含有0。注意,行和列的减法是分先后的。图中,标出了第一个矩阵中每行的最小值、第二个矩阵中每列的最小值,减完得到的第三个矩阵就是我们现在的系数矩阵,它的最优解与原来的系数矩阵一样。第一个矩阵中标红的是每一行中的最小值,第二个矩阵是第一个矩阵中每行都减去当行标红数得到的矩阵,标红的是每一列中的最小值,减去后得到第三个矩阵。

接下来的步骤是试解。显然如果有0,取0时成本肯定最低,因此,先找出不在同一行、列的零元素。这里,先找出在一行或一列中唯一的零元素圈起来(这里用○替代),在圈的同时,将这一行与这一列的其他0元素用×替代,这样的0就不能再取了。比如这里,位于(1,1)的零元素是这一列中唯一的零,可以取之,同时第一行的另外两个0就用×替代。○代表取,×代表不取

同理,(2,3)的0是当行唯一,圈起来的同时将同一列的全部打×。需要注意的是,并不是仅当0是当行或当列唯一时才可以取,只是唯一时,能够让取到的0个数最多。以此类推对整个系数矩阵进行处理,得到试指派结果如下图。○代表取,×代表不取,所有0都被这两种符号替代

此时,所有的0元素,或是被圈起来或是被叉去,代表试指派结束了。圈起来的0就表示安排工作,但此时,安排的工作不到5个,也就是安排尚未完成,没有得到最优解。因此进入第三步——对系数矩阵的调整。调整是一个循环划线的过程,操作如下:

(1)因为圈起来的0的数量小于矩阵维数,所以肯定有至少一行没有被圈起来的0,在那一行旁边打√;

(2)打√的行中,对所有含×的列打√;

(3)打√的列中,对所有含○的行打√;

(4)重复2和3直到没有√可以再打。此时对所有没有√的行画一横线、对有√的列画一竖线,这样,就用最少数量的直线覆盖了所有0元素(○和×),操作如下,这里打√用Ω代替,下标为打√的顺序,红色代表划线:\Omega代表打√,下标代表顺序,有三行和一列被划线

这时候,画出了四条线,这也是能够覆盖所有0元素的最小直线数量。如果直线数量等于矩阵维数,说明当前矩阵其实可以通过试指派达到最优解,只是前面的寻找过程出了问题,回去重新找即可;如果直线数量小于矩阵维数,那么当前矩阵就必须调整了。调整量就是没有被直线覆盖(图中黑色)的最小值,这里是2,将打√行中各元素减去这个值(注意打√行是没有被直线覆盖的),打√列中各元素加上这个值。处理后得到新的指派系数矩阵

这样调整完以后的矩阵,最优解和原来的系数矩阵是一样的,但是这时候系数矩阵的0变多了,也更有利于试指派找出最优解,这时候很容易就可以得出最优解如下。○数量与矩阵维数相同,指派结束

以上就是指派问题的解法,是要成本最小化时的解法。当然,有时候给定的系数矩阵可能是效用矩阵,要效用最大化,这时只需要找到最大效用值,用它减去所有的当前效用,就得到了最小化问题,再用匈牙利解法即可。总结指派问题的解法,有以下几个步骤:

(1)定性,如果遇到最大值问题,就用系数矩阵中的最大值减去矩阵中所有元素,这样得到的新系数矩阵用匈牙利解法得到的解是最优解。

(2)简化,将此时的系数矩阵,每一行减去当行最小值得到中间矩阵,再将中间矩阵的每一列减去当列最小值得到简化矩阵,这样得到的简化矩阵最优解与原系数矩阵一致。

(3)试指派,尽可能多地圈出位于不同行、不同列的0元素,并将圈出的0同一行列的其他0元素用×替代,如果能圈出与矩阵维数相同的0元素数量,则得到最优解,否则进入调整。

(4)划线,此时先将没有○的行打√,再将打√行中×所在的列打√,再将打√列中○所在的行打√,如此循环直至没有√可打。这时将没有打√的行划线,将打√的列划线,数直线数。

(5)调整,如果直线数等于矩阵维数,则回到3重新试指派直到得出最优解;否则,将直线没有覆盖区域的最小值作为调整量,让打√行减去调整量,打√列加上调整量得到新的系数矩阵,再进行试指派。

至此,线性规划的内容结束,接下来进入动态规划。

运筹学4个人完成三项工作_【用人话讲运筹学】十一、指派问题相关推荐

  1. excel计算二元线性回归_用人话讲明白梯度下降Gradient Descent(以求解多元线性回归参数为例)...

    文章目录 1.梯度 2.多元线性回归参数求解 3.梯度下降 4.梯度下降法求解多元线性回归 梯度下降算法在机器学习中出现频率特别高,是非常常用的优化算法. 本文借多元线性回归,用人话解释清楚梯度下降的 ...

  2. 景区如何做好旅游策划、旅游规划和旅游营销三项工作?

    熊大寻旅游规划公司认为:要成功开发一个旅游景区一定要走好前三步,第一步是旅游策划.第二步是旅游规划.第三步是旅游营销. 旅游策划简单说就是:一句话就能招来十三亿人! 没有策划指导的规划是乱划,没有规划 ...

  3. 前端自动化工作流_当每项工作都自动化时

    前端自动化工作流 App developer. Social media manager. Personal trainer. No person on Earth could have predic ...

  4. 信息安全 数据赛 铁人三项_信息安全铁人三项赛-赛事章程-信息安全铁人三项赛...

    赛事章程 竞赛总则 为贯彻<国务院关于大力推进大众创业万众创新若干政策措施的意见><国务院办公厅关于深化高等学校创新创业教育改革的实施意见>,落实中央网信办.国家发改委.教育部 ...

  5. 浏览器安全检查己通过_百度主动推送三项合一功能

    百度主动推送三项合一功能 作者:68喜 功能模块:搜索关键词记录推送熊掌号当天推送+熊掌号历史推送+普通主动推送 */ //错误显示屏蔽 error_reporting(E_ERROR | E_WAR ...

  6. js实现日历框上一日下一日_一日三项令人兴奋的Lucene功能

    js实现日历框上一日下一日 昨天是富有成效的一天:突然,Lucene有了三个令人兴奋的新功能. 表达式模块 昨天提交的第一个功能是新的expressions模块 . 这使您可以使用任意String表达 ...

  7. 怎么看准确率_做题粗心马虎怎么训练?采取这三项措施,有效提高做题的准确率...

    做题粗心马虎怎么训练?家长可以采取这三项措施,分别是引导孩子认真审题.要求孩子练习笔算.督促孩子检查作业. 引导孩子认真审题 很多孩子做题粗心马虎的原因是审题不清,也就是没有读懂题目的意思,或者误解了 ...

  8. 为什么只看重结果_买家下单最看重的三项服务,做好这三点,让你的销量涨涨涨...

    很多跨境卖家都会纠结于为什么消费者只浏览店铺却迟迟不下单呢?相同的产品,为什么有的店铺销量居高不下,而有的店铺一个月没有几笔订单呢? 消费者从网上购物一大半的原因是价格,另一半是因为产品丰富,可选择性 ...

  9. efm8bb1 烧录器_【技术】 EFM8BB1系列MCU三种工作模式详解

    MCU,该MCU最高运行频率可达25MHz, 其RAM容量最大为512B,FLASH容量最大可达8KB. EFM8BB1集成了丰富的外设资源,其内部集成12 bit A/D转换器,最高转换速率可达80 ...

  10. 改进量子计算机的三项创新

    来源:IEEE电气电子工程师本文约1500字,建议阅读5分钟来自六家公司和大学的研究人员提出了在低温下运行电路的新方法. Photo: Chalmers University of Technolog ...

最新文章

  1. 5页面如何切图_如何让你的设计稿做到95%还原?
  2. ASP.NET MVC5+EF6+EasyUI 后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】...
  3. poj 2976 基础01分数规划
  4. 使用scikit中的聚类
  5. 2016年2月流量入口占比动态:搜索引擎大涨2.14%
  6. python帮助文档在哪_python文档之查看帮助文档方法
  7. java代码生成器_java代码生成器怎么用
  8. MongoDB Documents
  9. Keras 中的循环神经网络 (RNN)
  10. 对开源库 limdu 命令注入漏洞 (CVE-2020-4066) 的简要分析
  11. 《二》Android 数据库 SQlite SQLiteOpenHelper
  12. 2022年全网首发|大数据专家级技能模型与学习指南(胜天半子篇)
  13. This request has been blocked; the content must be served over HTTPS.
  14. 华为荣耀手机 (HUAWEI Honor V9) USB 调试 - ADB 调试
  15. MATLAB中clc命令详解
  16. 反转一个英语句子c++
  17. Pygame实现小球躲避实例代码
  18. 超星移动图书馆opds_移动图书馆工厂实验室为农村地区带来了新技能
  19. 复旦大学有计算机网络专业,复旦大学自考本科计算机网络专业介绍
  20. python exception in thread_这个是什么原因,请问怎么处理Exception in thr

热门文章

  1. 国产智多晶FPGA下载器(调试器)的驱动安装方法
  2. 如何用计算机名安装打印机,如何添加打印机,教您添加共享打印机的方法
  3. 湘潭大学计算机分数线,湘潭大学录取分数线2021是多少分(附历年录取分数线)
  4. 操作系统实验七(银行家算法)
  5. vue面试五之vue修饰符中 .lazy 等用法、Vue v2.4中新增的$attrs及$listeners属性的使用、v-once 的使用场景、vue组件里的定时器该如何销毁、vue海量数据优化等
  6. oracle ovm配置使用
  7. 使用Echarts.js自定义X轴Y轴刻度画网格
  8. Ubuntu安装网络打印机
  9. vr软件测试,如何进行VR可用性测试?
  10. cdr2022更新24.1版CorelDRAW2022稳定版