matlab指派问题优化,[原创] Matlab 指派问题模型代码
指派问题的基本内容
一般来说指派问题解决的是如何将任务分配到人,使得任务完成的效益最大化(成本型效益则求最小值,利润型效益则求最大值)。上述问题一个 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) % 修改输入测试效果
原文:https://www.cnblogs.com/gshang/p/11510872.html
matlab指派问题优化,[原创] Matlab 指派问题模型代码相关推荐
- sbm预测matlab,**matlab计算非期望产出sbm模型代码**
matlab计算非期望产出sbm模型代码 data1=xlsread('E:\论文材料\毕业论文\02.xlsx',1) data2=xlsread('E:\论文材料\毕业论文\02.xlsx',2) ...
- 视频教程-三十八课时零基础matlab精通优化算法-Matlab
三十八课时零基础matlab精通优化算法 图像和算法等领域有多年研究和项目经验:指导发表科技核心期刊经验丰富:多次指导数学建模爱好者参赛. 宋星星 ¥100.00 立即订阅 扫码下载「CSDN程序员学 ...
- matlab拓扑优化流程图,matlab 拓扑优化 A variety of MATLAB topological optimi - DSSZ
文件名大小更新时间 matlab 拓扑优化\esoL.m38182015-07-02 matlab 拓扑优化\esoX.m38582015-07-02 matlab 拓扑优化\softbeso.m36 ...
- matlab 函数优化问题,matlab求解最优化问题 Matlab在最优化问题中的应用举例.doc
matlab求解最优化问题 Matlab在最优化问题中的应用举例 导读:就爱阅读网友为您分享以下"Matlab在最优化问题中的应用举例"的资讯,希望对您有所帮助,感谢您对92的支持 ...
- matlab 动态优化,基于Matlab的测控系统动态性能优化与仿真
随着测试技术的发展,人们采用传感器测控系统的动态性能指标来表征系统性能.描述传感器的主要动态性能指标是工作频带,系统的动态性能研究的重要一步是在辨识出合适的模型结构和模型参数的基础上,根据现有的工作频 ...
- 灰狼优化matlab,灰狼优化算法——MATLAB
1 tic %计时器2 %%清空环境变量3 close all4 clear5 clc6 format compact7 %%数据提取8 % 载入测试数据wine,其中包含的数据为classnumbe ...
- matlab 异步电机发电,[原创]Matlab双馈异步风力发电机建模s函数
双馈异步发电机模型一直是风力发电研究的重点,而很多论文的仿真根本就没有建电机模型,这样的仿真是很不准确的,matlab中自带了一个DFIG模型,而这个模型是将发电机.变流器等各个部分都建好了,但对研究 ...
- matlab数值解方程,[原创]MATLAB的Mupad应用之以数值方法解方程
本帖最后由 lijinfeng042 于 2010-11-3 19:26 编辑 使用Mupad可以非常方便的求解非线性方程的数值解,简化输入的步骤,同时添加各种限制~只要有一下几个函数numeric: ...
- 遗传算法优化matlab,遗传算法优化相关MATLAB算法实现
遗传算法 1.案例背景 遗传算法(Genetic Algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的"物竞天择.适者生存"的演化法则.遗传算法的做法是把问题参数编 ...
最新文章
- python画三维几何图-Python下opencv使用笔记(二)(简单几何图像绘制)
- Java 7之基础 - 强引用、弱引用、软引用、虚引用
- 全新的互动广告牌,待遇男女有别
- containerd安装及常用命令
- 自然语言处理实践Task5
- android 获取是否连接wifi热点,android - 如何知道您是否已连接到Wifi热点/ Wifi / Wifi Direct - 堆栈内存溢出...
- mysql数据库的创建外键_Mysql表创建外键报错解决方案
- Machine Learning笔记(三) 多变量线性回归
- 2021年中国研究生数学建模竞赛D题——抗乳腺癌候选药物的优化建模
- flowable工作流所有业务概念
- HTML5多文件上传插件----zyUpload
- 关于微信小程序中的取整
- God.org单域环境攻略(一)
- 笔记——输入框循环使用
- Mysql数据库 | SQL语句解析『下篇』
- 在国内,如何优雅的使用ChatGPT??
- 360浏览器的404报错页
- Consider defining a bean of type ‘com.netflix.client.config.IClientConfig‘ in your configuration
- C++实现德州扑克游戏(和电脑一起玩)
- js 前端 时间戳转字符串 2019-08-18T16:00:00.000Z 转换 2019-08-19 00:00:00
热门文章
- Java bad verson 错误
- 基于web的前后端分离nodejs和vue.js医院分诊系统
- 想对在大学里的同学们说。
- Puppeteer入门实践
- 微信小程序点击按钮弹出弹窗_微信小程序点击按钮 弹出底部上拉菜单
- mycat 实施指南_高级文件系统实施者指南,第8部分
- CAD、3dmax、Maya、Revit安装过程中显示产品已安装,如何卸载干净?
- tar.xz格式的文件解压方法
- 关于c语言报错error C4996: ‘scanf‘: This function or variable may be unsafe.
- Win11的两个实用技巧系列清理磁盘碎片、设置系统还原点的方法