最近受到南京一个同学的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的若干思考的更多相关文章

  1. Android中关于Handler的若干思考

    在之前的博文中,讲过一些和Handler有关的知识,例如: Android 多线程----AsyncTask异步任务详解 Android多线程----异步消息处理机制之Handler详解 今天再把Ha ...

  2. 用分支限界法解决人员安排问题(Personnel assignment problem)

    最近考期博主比较忙,先把思路简单说说,图和代码考完试补. 人员安排问题,即给出员工集合和工作集合,寻找最合理的安排. 对于员工集合P,员工集合会依据某个f来给出某种顺序,需要按该顺序P(i)进行工作安 ...

  3. Kinect 开发 —— 用户交互设计的若干思考

    Metro 风格 windows 8 Kinect Hub 手势原型设计 悬停选择     翻页控制 关节点重叠的处理方法 将箭靶设置在画面的边缘,这样玩家持弓的角度与屏幕保持一个大约45度的锐角,这 ...

  4. data structure assignment problem record

    Question1: Similar to pause command in linux read -n 1 Question2 read : Illegal option -n 原因为ubuntu ...

  5. 2015 Multi-University Training Contest 1 - 1002 Assignment

    Assignment Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Mean: 给你一个数列和一个k,求连续区间的极值之 ...

  6. 【HDU 2853】Assignment (KM)

    Assignment Problem Description Last year a terrible earthquake attacked Sichuan province. About 300, ...

  7. 分配问题与Hungarian算法

    分配问题与Hungarian算法 分配问题 指派问题 匈牙利算法 匈牙利方法是一种能够在多项式时间内解决分配问题(assignment problem)的组合优化算法.它由Harold Kuhn 与1 ...

  8. Deep Reinforcement Learning: Pong from Pixels

    这是一篇迟来很久的关于增强学习(Reinforcement Learning, RL)博文.增强学习最近非常火!你一定有所了解,现在的计算机能不但能够被全自动地训练去玩儿ATARI(译注:一种游戏机) ...

  9. Python小白的数学建模课-07 选址问题

    选址问题是要选择设施位置使目标达到最优,是数模竞赛中的常见题型. 小白不一定要掌握所有的选址问题,但要能判断是哪一类问题,用哪个模型. 进一步学习 PuLP工具包中处理复杂问题的字典格式快捷建模方法. ...

随机推荐

  1. day14.面向对象编程

    一 对象的概念 "面向对象"的核心是"对象"二字,而对象的精髓在于"整合" 所有的程序都是由"数据"与"功能& ...

  2. 以 DEBUG 方式深入理解线程的底层运行原理

    说到线程的底层运行原理,想必各位也应该知道我们今天不可避免的要讲到 JVM 了.其实大家明白了 Java 的运行时数据区域,也就明白了线程的底层原理,不过把这些东西明明白白写在纸面上的,网络上的文章并 ...

  3. 1035 Password

    To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem ...

  4. 1.5.1- HTML之相对路径

    网页需要图片,首先需要找到它.实际工作中,通常新建一个文件夹专门用于存放图像文件,这时插入图像,就需要采用"路径"的方式来制定图像文件的位置.路径可以分为相对路径与绝对路径. 相对 ...

  5. jq 获取表单全部数据

    jQuery Ajax 操作函数: serialize(): 将表单内容序列化为字符串 serializeArray():序列化表单元素,返回JASON数据 语法: $(selector).seria ...

  6. node-mongo封装

    node 里面调用mongo封装了下. mongo.js文件 const { MongoClient, ObjectId } = require('mongodb'); const mongourl ...

  7. Android开机时间分析

    http://blog.csdn.net/huangyabin001/article/details/42777703

  8. java之Map的使用

    Map的实现类有很多,其中较为常见的有HashMap,HashTable,LinkedHashMap,TreeMap,下面分别对这几个类进行简单的分析: 1.HashMap HashMap的结构数组+ ...

  9. 【】POST、GET、RequestParam、ReqestBody、FormData、request payLoad简单认知

    背景: 使用vue+axios方式代替ajax后向后台发送数据出现问题了,controller获取不到数据.然后查.找.查.找中似乎找到一些门道.以下列出总结性的东西来记录自己的思考成果,仅供参考,不 ...

  10. mysql-创建用户并授权,设置允许远程连接

    一.创建用户并授权 1.登录mysql mysql -u root -q 2.创建数据库 create database dbdata;//以创建dbdata为例 3.创建用户 创建user01,只能 ...