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项任务的费用最少。

一般把目标函数的系数写为矩阵形式,称矩阵

Assignment Problem的若干思考

为系数矩阵(Coefficient Matrix),也称为效益矩阵或价值矩阵。矩阵的元素(i,j=1,2,…n)表示分配第i个人去完成第j项任务时的效益。一般地,以表示给定的资源分配用于给定活动时的有关效益(时间,费用,价值等),且

Assignment Problem的若干思考

3.2 问题的数学模型一般形式

Assignment Problem的若干思考

在模型中,约束条件式(2)表示每个人只能做一件事,约束条件式(3)表示每件事只能由一个人去做。

对于问题的每个可行解,可用解矩阵来表示:

Assignment Problem的若干思考

当然,作为可行解,矩阵的每列元素中都有且只有一个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

Assignment Problem的若干思考

所以最优解为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 模型建立

Assignment Problem的若干思考

由此,建立的数学模型为:

Assignment Problem的若干思考

5. 进一步思考

其实实际中每个工人要做多个任务,否则对于发起者来说成本太高了。而且考虑到任务的完成质量,每个任务要由多个人去做~那么该如何实现呢?是不是听起来感觉很简单的样子,做起来又不会做了呢?哈哈哈,这就是我存在的价值~帮您解决您的个性化的问题

Original: https://www.cnblogs.com/hxsyl/p/14820791.html
Author: 加拿大小哥哥
Title: Assignment Problem的若干思考

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/545622/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 视图

    视图1. 概念视图是一种虚拟存在的表,对于使用视图的用户来说基本上是透明的。视图并不在数据库中实际存在,行和列数据来自定义视图的查询总使用的表,并且是在使用视图时动态生成的。 视图…

    技术杂谈 2023年7月25日
    069
  • HIT软构博客10-软件构造基础

    软件构造的多维度视图和质量目标 三个维度 Build-Time和Run-Time Moment、Period Code-Level,Component-Level 软件系统的质量属…

    技术杂谈 2023年7月11日
    085
  • win7系统防止中招勒索病毒

    echo @@ netsh advfirewall firewall add rule name="Deny TCP 123" dir=out action=b…

    技术杂谈 2023年5月31日
    085
  • Springboot优雅参数校验,统一响应,异常处理

    1.统一响应 (1)统一状态码首先定义一个状态码接口,所有状态码都需要实现它 public interface StatusCode { public int getCode();…

    技术杂谈 2023年7月24日
    059
  • Http请求头缓存设置方法?

    Cache-control, expire, last-modify Java Program! posted @2020-12-27 22:10 咔啡 阅读(315 ) 评论()…

    技术杂谈 2023年5月31日
    095
  • Springboot中整合knife4j接口文档

    在项目开发过程中,web项目的前后端分离开发,APP开发,需要由前端后端工程师共同定义接口,编写接口文档,之后大家都根据这个接口文档进行开发。 什么是knife4j 简单说knif…

    技术杂谈 2023年6月21日
    0101
  • 分布式中灰度方案实践

    让请求在导航的服务节上点执行; 一、背景简介 分布式系统中会存在这样的开发场景,不同需求可能涉及到对同一个服务的开发,那么该服务在研发期间就会存在多个版本并行的状态,为了保持不同版…

    技术杂谈 2023年7月23日
    082
  • CityEngine中动态水的实现

    地址:http://pan.baidu.com/share/link?shareid=3871210059&uk=3492170216密码:am5b 在今年Esri全球用户…

    技术杂谈 2023年5月31日
    079
  • 手动配置 kubectl 连接 kubernetes 集群

    拿到集群 api server 地址 $ kubectl cluster-info Kubernetes control plane is running at https://k…

    技术杂谈 2023年5月31日
    089
  • 无需编程,基于微软mssql数据库零代码生成CRUD增删改查RESTful API接口

    无需编程,基于微软mssql数据库零代码生成CRUD增删改查RESTful API接口 回顾 通过之前一篇文章无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RES…

    技术杂谈 2023年7月25日
    089
  • GCC常见命令

    rwx 对于目录和文件的区别 文件 目录 r 文件的内容可以被查看。支持cat、more、head…vim 目录的内容可以被查看。ls、tree w 文件的内容可以被添…

    技术杂谈 2023年6月21日
    0115
  • 人脸识别经典算法二:LBP方法

    与第一篇博文特征脸方法不同,LBP(Local Binary Patterns,局部二值模式)是提取局部特征作为判别依据的。LBP方法显著的优点是对光照不敏感,但是依然没有解决姿态…

    技术杂谈 2023年5月31日
    0100
  • 嵌入式软件架构设计-消息交互

    1、前言 在熟悉任务调度、程序分层和模块化编程关于软件架构、分层和模块设计后,除了函数调用设计中出现的情况外,还会遇到同层模块之前如何进行消息交互,通常是应用层之间。 比如一个设备…

    技术杂谈 2023年7月25日
    0100
  • 面试常遇的打家劫舍问题你学会了吗~

    打家劫舍I 问题描述 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被…

    技术杂谈 2023年7月25日
    065
  • 并查集(UnionFind)

    并查集和其他树形结构不一样,是由孩子指向父亲,它解决了一些连接问题,怎么才能确定两个点是否相连呢?并查集可以非常快的确定两个点是否连接。 如何确定连个点是否连接呢? 我们可以用一个…

    技术杂谈 2023年7月23日
    078
  • 8月份全球技术标准更新

    2022年8月4日,毛里求斯信息和通信技术管理局 (ICTA) 发布了《关于在 5945-6425 MHz频率范围内为宽带无线接入服务分配额外频谱的决定》,允许5945-6425 …

    技术杂谈 2023年6月21日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球