指派问题的基本内容

一般来说指派问题解决的是如何将任务分配到人,使得任务完成的效益最大化(成本型效益则求最小值,利润型效益则求最大值)。上述问题一个 0 - 1 整数规划问题。

问题围绕着任务和人展开,即存在着 m 个任务,以及 n 个人。每个人处理每个任务都会有对应的效益,将所有人的情况写在一起,就组成了一个 m*n 的效益矩阵。

当 m = n 时,即此时,任务数和人数相等,那么每个人都会处理一项任务,存在如下约束:

对于任务来说,每个任务必须分配一个人;

对于人来说,每个人必须分配一个任务。

类似的,当 m < n 时,任务数小于人数,则存在如下约束:

对于任务来说,每个任务必须分配一个人;

对于人来说,每个人可能会被分配到一个任务,也可能没有分配到任务。

当 m > n 时,任务数大于人数,则存在如下约束:

对于任务来说,每个任务必须分配一个人;

对于人来说,每个人可能会被分配到一个或者多个任务,但最多不超过任务总数。

模型调用形式

 [x,min_fval,exitflag] = myTaskArrange2(f)

调用说明:

输入变量为一个 m*n 的效益矩阵,其中 m 行为 m 个任务, n 列为 n 个人。

输出变量 x 为与效益矩阵同型的 0-1 矩阵,1表示被安排,0表示不被安排;min_fval 为最优目标值;exitflag 为退出标识符,一般等于 1 表示解收敛。

模型代码

function [x,min_fval,exitflag] = myTaskArrange2(f)
%% 程序功能说明
%求解不平衡任务指派问题
%====输入参数====
%f m行n列的效益矩阵,m个任务,n个人,
%====输出参数====
%x 目标函数取最小值时的自变量值
%min_fval 目标函数的最小值
% exitflag 退出标识符
%程序编写时间:2019年09月 %% 程序主体
[m,n] = size(f); % 获取效益矩阵中任务的个数和人的个数 % 按行拉成一列向量
f = f';
F = f(:); % 构造等式约束(每一行加起来等于1,即每个任务必须分配一人)
Aeq = cell(m,m);
Aeq(:) = {zeros(1,n)};
Aeq(eye(m,m)==1) = {ones(1,n)};
Aeq = cell2mat(Aeq);
Beq = ones(m,1); % 取整变量地址
intcon = 1:m*n; % 变量取值范围(大于0小于1)
LB = zeros(m*n,1);
UB = ones(m*n,1); if m == n % 如果任务数等于人数
% 构造等式约束(每个人一定会被安排)
Aeq2 = repmat(eye(n,n),1,m);
Beq2 = ones(n,1);
Aeq = [Aeq;Aeq2];
Beq = [Beq;Beq2]; % 整数规划求解
[x,min_fval, exitflag] = intlinprog(F,intcon,[],[],Aeq,Beq,LB,UB); elseif m < n % 如果任务数小于人数
% 构造不等式约束(每一列加起来大于0小于1,即每个人可能被安排也可能不被安排一个任务)
A = repmat(eye(n,n),1,m);
B = ones(n,1);
% 利用整数规划函数求解
[x,min_fval, exitflag] = intlinprog(F,intcon,A,B,Aeq,Beq,LB,UB); elseif m > n % 如果任务数大于人数
% 构造不等式约束(每一列加起来大于1小于m,即每个人可能被安排一个或者多个任务,最多不超过任务数m)
A = repmat(eye(n,n),1,m);
B = ones(n,1)*m;
% 利用整数规划函数求解
[x,min_fval, exitflag] = intlinprog(F,intcon,A,B,Aeq,Beq,LB,UB);
end
%% 将结果还原成效益矩阵对应形式
x = reshape(x,n,m)';

测试算例

为了验证本模型的效果,提供如下测试算例,进行验证:


% 4项任务,4个人完成 最优解:8
f1 = [6,1,3,8;
6,3,5,2;
1,1,1,4;
7,2,5,2]; % 4项任务,5个人完成 最优解:127.8
f2 = [37.7,32.9,38.8,37,35.4;
43.4,33.1,42.2,34.7,41.8;
33.3,28.5,38.9,30.4,33.6;
29.2,26.4,29.6,28.5,31.1]; % 5项任务,3个人完成 最优解:116
f3 = [25,39,34;
29,38,27;
31,26,28;
4,20,40;
37,18,32]; [x,min_fval,exitflag] = myTaskArrange2(f1) % 修改输入测试效果

[原创] Matlab 指派问题模型代码的更多相关文章

  1. Matlab 整数线性规划问题模型代码

    整数线性规划问题的基本内容 整数线性规划解决的是自变量在一定的线性约束条件下,使得线性目标函数求得最大值或者最小值的问题.其中自变量只能取整数.特别地,当自变量只能取0或者1时,称之为 0-1 整数规 ...

  2. Matlab 非线性规划问题模型代码

    非线性规划问题的基本内容 非线性规划解决的是自变量在一定的非线性约束或线性约束组合条件下,使得非线性目标函数求得最大值或者最小值的问题. 当目标函数为最小值时,上述问题可以写成如下形式: \[ \mi ...

  3. Matlab 线性规划问题模型代码

    线性规划问题的基本内容 线性规划解决的是自变量在一定的线性约束条件下,使得线性目标函数求得最大值或者最小值的问题. \[ \min z=\sum_{j=1}^{n} f_{j} x_{j} \] \[ ...

  4. Matlab 图论最短路问题模型代码

    最短路问题的基本内容 最短路问题研究的是,在一个点与点之间连接形成的网络图中,对应路径赋予一定的权重(可以理解为两点之间的距离),计算任意两点之间如何和走,路径最短的问题.在这里的距离可以理解成各种两 ...

  5. 球体的双目视觉定位(matlab,附代码)

    球体的双目视觉定位(matlab,附代码) 标签(空格分隔): 机器视觉 引言 双目视觉定位是我们的一个课程设计,最近刚做完,拿出来与大家分享一下,实验的目的是在拍摄的照片中识别球体,并求出该球体到相 ...

  6. [原创]IBM BLM模型思维导图

    [原创]IBM BLM模型思维导图 IBM业务领先模型 http://wenku.baidu.com/view/1d1d247af242336c1eb95e3b.html?from=search

  7. k-means算法MATLAB和opencv代码

    上一篇博客写了k-means聚类算法和改进的k-means算法.这篇博客就贴出相应的MATLAB和C++代码. 下面是MATLAB代码,实现用k-means进行切割: %%%%%%%%%%%%%%%% ...

  8. 多路复用I/O模型poll() 模型 代码实现

    多路复用I/O模型poll() 模型 代码实现 poll()机制和select()机制是相似的,都是对多个描述符进行轮询的方式. 不同的是poll()没有描述符数目的限制. 是通过struct pol ...

  9. Windows Socket五种I/O模型——代码全攻略(转)

    Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模式.可以通过多线程技术进行处理. 非阻塞模式:执行I/O操 ...

随机推荐

  1. 编程杂谈——Platform target x64

    在Visual Studio中选择.NET Framework框架并选用任意模板创建一个普通的Web应用工程,毫无疑问,此时应该是能够正常运行此工程的. 但是将工程属性->编译->Plat ...

  2. Linux环境搭建 | VMware下共享文件夹的实现

    在进行程序开发的过程中,我们经常要在主机与虚拟机之间传递文件,比如说,源代码位于虚拟机,而在主机下阅读或修改源代码,这里就需要使用到 「共享文件」 这个机制了.本文介绍了两种共享文件夹的实现机制:VM ...

  3. 分享各大CMS采集资源站网址合集

    分享各大CMS采集资源站网址合集 http://www.172zy.xyz/ 172云资源 http://www.dbzyz.com/ 豆瓣云资源 http://www.gaoqingzy.com/ ...

  4. Kafka到底有几个Offset?——Kafka核心之偏移量机制

    ​ Kafka是由LinkIn开源的实时数据处理框架,目前已经更新到2.3版本.不同于一般的消息中间件,Kafka通过数据持久化和磁盘读写获得了极高的吞吐量,并可以不依赖Storm,SparkStre ...

  5. CSS3 表单

    <form action="http://baidu.com"> <input type="text" placeholder="请 ...

  6. 人员考勤,MySQLl数据库一个表自动生成3表筛选人员迟到早退缺勤

    前言:漂亮的人事小姐姐找我帮忙弄考勤:由于人员考勤和门禁一起,打卡记录太多,打卡机只能导出一个打卡Excel总表,不容易人工筛选. Excel表的格式是这样的:(这里101代替真实人名) 实现目标: ...

  7. Codeforces 1008C

    题意略. 思路: 其实我们没有必要关注每个数字的位置,我们只要把大的数字放在小的数字上就可以了,这样它的位置必然会发生变换. 在变换时,这个替换的序列越长越好,每个序列对答案的贡献就是该序列的长度 - ...

  8. ElementUI使用v-if控制tab标签显示遇到的Duplicate keys detected: 'xxx'问题

    今天工作遇到一个问题: 需求背景:页面中有几个tab,需要根据登录用户的权限控制tab标签的显示与隐藏 . <el-tabs @tab-click="handleClick" ...

  9. TypeError: 'in <string>' requires string as left operand, not int

    报错 Traceback (most recent call last): File "D:/PyCharm 5.0.3/WorkSpace/2.NLP/9.DL在NLP中的应用/4. Ve ...

  10. atcoder D - 11(组合数学)

    题目链接:http://arc077.contest.atcoder.jp/tasks/arc077_b 题解:有n+1个数只有一个数字是有重复出现的,要求一共有多少不同的组合显然和这两个数的位置有关 ...