Assignment Problem的若干思考
最近受到南京一个同学的push,又开始了博客园写作之旅。欢迎大家联系我做代码实现工作,QQ:1198552514。权当赚点生活费~
我的研究也经常用的Assignment problem,而且很多问题都能转化为指派问题。比如轮灌和滴灌问题(对喷头分组,每组喷头负责一部分区域,从而使得区域覆盖最大,同时还有很多其他约束),这个问题在国内尚属空白,而且找不到任何代码~笔者已经实现了均衡约束的轮灌、滴灌算法~当时帮新疆的一个同学做的(基于粒子群),没想到我竟然真的做了出来~所以你只要给我数学模型或者说让我听懂你的问题就能帮你做出来
粒子群的帖子: https://www.cnblogs.com/hxsyl/p/4521778.html
1. 问题陈述
指派问题又称分配问题,其用途非常广泛,比如某公司指派n个人去做n件事,各人做不同的事,如何安排人员使得总费用最少?若考虑每个职工对工作效率(如熟练程度等),怎样安排会使总销量达到最大?这些都是一个企业经营管理者必须考虑的问题,所以该问题有重要的应用价值。
假设有n件工作分派给n个人来做,每项工作只能由一人来做,每个人只能做一项工作。若给出各人对各项工作所具有的工作效率。问应该如何安排人选,及发挥个人特长又能使总的效率最大。为此用0-1整数规划来实现指派问题即如何安排人选。
2. 指派问题的背景
在现实生活中,有各种性质的指派问题(Assignment Problem)。例如,在生产管理中,总希望把人员进行最佳分配,以发挥最大的工作效率;某部门有n项任务要完成,而该部门正好有n个人可以分别去完成其中任何一项,但由于任务性质和个人的专长不同,因此各人完成各项不同任务的效益(所费时间或所花费用)也有差别,如果分配每个人完成一项任务且仅为一项任务,则把每项任务分配给哪个人去完成,使完成所有n项任务的总效益为最高(总时间、总费用为最小或创造的价值最大)?这是典型的分配问题或指派问题。又如有n项加工任务,怎样指定n台机器分别去完成,以使总的加工时间最少或总收入最大;有n条航线,怎样指定n艘船分别航行,使总收入最大,等等,都属于指派问题。
3. 指派问题的描述
3.1 指派问题的一般形式
指派问题的标准形式(以人和事为例)如下。有n个人和n项任务,已知第i个人做第j件事的费用为,要求确定人和事之间的一一对应的指派方案,使完成这n项任务的费用最少。
一般把目标函数的系数写为矩阵形式,称矩阵
为系数矩阵(Coefficient Matrix),也称为效益矩阵或价值矩阵。矩阵的元素(i,j=1,2,…n)表示分配第i个人去完成第j项任务时的效益。一般地,以表示给定的资源分配用于给定活动时的有关效益(时间,费用,价值等),且
3.2 问题的数学模型一般形式
在模型中,约束条件式(2)表示每个人只能做一件事,约束条件式(3)表示每件事只能由一个人去做。
对于问题的每个可行解,可用解矩阵来表示:
当然,作为可行解,矩阵的每列元素中都有且只有一个1,以满足约束条件式(3)。每行元素中也有且只有一个1,以满足约束条件(2)。指派问题n!个可行解。
4.指派问题实现
4.1 匈牙利算法
4.1.1 匈牙利算法的理论基础
定理1 如果从分配问题的效率矩阵[]的每一行元素中分别减去(或加上)一个常数,从每一列中分别减去(或加上)一个常数,得到一个新的效率矩阵[],则以[]为效率矩阵的分配问题与以[]为效率矩阵的分配问题具有相同的最优解。
定理2 若矩阵A的元素可以分为‘0’与‘非0’的两部分,则覆盖‘0’元素最少直线数等于位于不同行不同列的‘0’元素的最大个数。
4.1.2匈牙利算法的实现步骤
第一步:找出矩阵每行的最小元素,分别从每行中减去这个最小元素;
第二步:再找去矩阵每列的最小元素,分别从各列减去这个最小元素;
第三步:经过这两步变换后,矩阵的每行每列至少都有了一个零元素,接着根据以下准则进行试指派,找出覆盖上面矩阵中所有零元素至少需要多少条直线;
(1)从第一行开始,若该行只有一个零元素打上()号。对打()号零元素所在列划一条直线。若该行没有零元素或有两个以上零元素(已划去的不计在内),则转下一行,一直到最后一行为止;
(2)从第一列开始,若该列只有一个零元素就对这个零元素打上()号(同样不考虑已划去的零元素),对打()号零元素所在行划一条直线。若该列没有零元素或 还有两个以上零元素,则转下一列,并进行到最后一列;
(3)重复(1)、(2)两个步骤,可能出现三种情况:
① 矩阵每行都有一个打()号零元素,很显然,按照上述步骤得到的打()的零元素都位于不同行不同列,因此就找到了问题的答案;
② 有多于两行或两列存在两个以上零元素,即出现了零元素的闭回路,这个时候可顺着闭回路的走向,对每个间隔的零元素打上()号,然后对所有打()号零元素或所有列或所在行划一条直线。
③ 矩阵中所有零元素或打上()号,或被划去,但打()号零元素个数小于m。
第四步:为了设法使每行都有一个打()的零元素,就要继续对矩阵进行变换;
(1)从矩阵未被直线覆盖的元素找出最小元素k;
(2)对矩阵的每行,当该行有直线覆盖时,令=0,无直线覆盖的,令=k;
(3)对矩阵的每列,当该列有直线覆盖时,令=-k,无直线覆盖的,令=0;
(4)得列一个变换后的矩阵,其中每个元素=--。
第五步:回到第三步,反复进行,一直到矩阵中每一行都有一个打()的零元素为止,即找到最优分配方案为止。
4.1.3 匈牙利算法实现指派问题
为了便于对模型进行求解与分析,假设有4件事4个人去做,各变量对应的数据假设如表1。
表1 每个人完成各项任务需要的时间
人 |
任务 |
|||
A |
B |
C |
D |
|
甲 |
25 |
29 |
31 |
42 |
乙 |
39 |
38 |
26 |
20 |
丙 |
34 |
27 |
28 |
40 |
丁 |
24 |
42 |
36 |
23 |
所以最优解为x11,x23,x32,x44,即甲负责任务A,乙负责任务C,丙负责任务B,丁负责任务D,可以使总花费时间最少。代入求出目标函数值
Z=25+26+27+23=101。
4.2 0-1整数规划
0-1规划(0-1 Programming)一种特殊形式的整数规划 。这种规划的决策变量仅取值0或1,故称为0-1变量或二进制变量 ,因为一个非负整数都可以用二进制记 数法用若干个0-1变量表示 。0-1变量可以数量化地描述诸如开与关、取与弃、有与无等现象所反映的离散变量间的逻辑关系、顺序关系以及互斥的约束条件 ,因此0-1规划非常适合描述和解决如线路设计 、工厂选址 、生产计划安排、旅行购物、背包问题、人员安排、代码选取、可靠性等人们所关心的多种问题。实际上,凡是有界变量的整数规划都可以转化为0-1规划来处理。当然也包括运筹学中的指派问题。
4.2.1 模型假设
为了便于对模型进行求解与分析,假设有4件事4个人去做,各变量对应的数据假设如表1。
表1 每个人完成各项任务需要的时间
人 |
任务 |
|||
A |
B |
C |
D |
|
甲 |
25 |
29 |
31 |
42 |
乙 |
39 |
38 |
26 |
20 |
丙 |
34 |
27 |
28 |
40 |
丁 |
24 |
42 |
36 |
23 |
表2 变量假设
i |
第i个人 |
j |
第j项任务 |
第i个人分配第j项任务 |
|
=1 |
第i个人被分配去做第j项任务 |
=0 |
第i个人不被分配到第j项任务 |
4.2.2 模型建立
由此,建立的数学模型为:
5. 进一步思考
其实实际中每个工人要做多个任务,否则对于发起者来说成本太高了。而且考虑到任务的完成质量,每个任务要由多个人去做~那么该如何实现呢?是不是听起来感觉很简单的样子,做起来又不会做了呢?哈哈哈,这就是我存在的价值~帮您解决您的个性化的问题
Assignment Problem的若干思考的更多相关文章
- Android中关于Handler的若干思考
在之前的博文中,讲过一些和Handler有关的知识,例如: Android 多线程----AsyncTask异步任务详解 Android多线程----异步消息处理机制之Handler详解 今天再把Ha ...
- 用分支限界法解决人员安排问题(Personnel assignment problem)
最近考期博主比较忙,先把思路简单说说,图和代码考完试补. 人员安排问题,即给出员工集合和工作集合,寻找最合理的安排. 对于员工集合P,员工集合会依据某个f来给出某种顺序,需要按该顺序P(i)进行工作安 ...
- Kinect 开发 —— 用户交互设计的若干思考
Metro 风格 windows 8 Kinect Hub 手势原型设计 悬停选择 翻页控制 关节点重叠的处理方法 将箭靶设置在画面的边缘,这样玩家持弓的角度与屏幕保持一个大约45度的锐角,这 ...
- data structure assignment problem record
Question1: Similar to pause command in linux read -n 1 Question2 read : Illegal option -n 原因为ubuntu ...
- 2015 Multi-University Training Contest 1 - 1002 Assignment
Assignment Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Mean: 给你一个数列和一个k,求连续区间的极值之 ...
- 【HDU 2853】Assignment (KM)
Assignment Problem Description Last year a terrible earthquake attacked Sichuan province. About 300, ...
- 分配问题与Hungarian算法
分配问题与Hungarian算法 分配问题 指派问题 匈牙利算法 匈牙利方法是一种能够在多项式时间内解决分配问题(assignment problem)的组合优化算法.它由Harold Kuhn 与1 ...
- Deep Reinforcement Learning: Pong from Pixels
这是一篇迟来很久的关于增强学习(Reinforcement Learning, RL)博文.增强学习最近非常火!你一定有所了解,现在的计算机能不但能够被全自动地训练去玩儿ATARI(译注:一种游戏机) ...
- Python小白的数学建模课-07 选址问题
选址问题是要选择设施位置使目标达到最优,是数模竞赛中的常见题型. 小白不一定要掌握所有的选址问题,但要能判断是哪一类问题,用哪个模型. 进一步学习 PuLP工具包中处理复杂问题的字典格式快捷建模方法. ...
随机推荐
- 【笔记】《Redis设计与实现》chapter9 数据库
9.1 服务器中的数据库 Redis服务器将所有都保存在服务器状态redis.h/redisServer结构中 struct redisServer{ //... // 一个数组,保存着服务器中所有数 ...
- 诸葛亮的锦囊妙计竟然是大名鼎鼎的Java设计模式:策略模式
目录 应用场景 简单实现例子 改进代码 策略模式 定义 意图 主要解决问题 何时使用 优缺点 诸葛亮的锦囊妙计 应用场景 京东.天猫双十一,情人节商品大促销,各种商品有不同的促销活动 满减:满200减 ...
- Mybatis3源码笔记(六)SqlSession执行过程
前几篇大致分析了初始化的过程,今天打算走一个SqlSession具体执行过程. @Test void shouldSelectAllAuthors() { try (SqlSession sessio ...
- Dropping Balls UVA - 679
A number of K balls are dropped one by one from the root of a fully binary tree structure FBT. Eac ...
- JAVAEE_01_什么是javaEE
javaEE Java平台包含三个版本: - JavaME :适用于小型设备和智能卡的JavaME (Java Platform Micro Edition,Java微型版) - JavaSE : 适 ...
- JavaScript课程——Day07(对象简介、Math对象、时间对象、字符串对象)
1.对象简介 在javaScipt中,一切皆为对象或者皆可以被用作对象 宿主对象:window,document 内置对象:Number String Boolean Array数组 Obje ...
- Zabbix三种邮箱告警配置
环境 环境 IP地址 主机名 需要安装的应用 系统版本 服务端 192.168.23.140 zabbix lamp zabbix_server zabbix_agent CentOS 8 客户端 1 ...
- 反调试——Windows异常-SEH
反调试--Windows异常-SEH 概念: SEH:Structured Exception Handling SEH是Windows默认的异常处理机制 如何使用 在代码中使用 __try__e ...
- windows内核编程基础知识
/* 1.基本的驱动数据结构 //驱动对象结构体 typedef struct _DRIVER_OBJECT { CSHORT Type; //结构类型 CSHORT Size; //结构大小 PDE ...
- hdu1978 简单记忆化搜索
题意: How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...