整数线性规划求工作方向分配问题最优解(matlab求解)

        职业分配问题是我们生活学习分配工作问题经常遇到的问题之一,下面我们来利用整数线性规划求解一下这种问题如何求出最优解。

        首先我们来重述一下什么是职业分配问题,职业分配问题是指小组或一群人之中对于每个职业的偏好选择或者技能专精有所不同(即单个人对不同职业的权重有所不同),每个人只能选择一个职业,每个职业只需要一个人的前提下,作为工作分配人员如何给这群人分配工作以达到最大效率,最大效率是多少。上述问题具有非常大的现实意义,只要掌握了一般方法即可反推相似类型问题解法。

        如果学过线性规划可以知道这个很明显是具有多约束条件的线性规划问题,这个问题可以建模为最大权匹配问题,使用 MATLAB 中的优化工具箱来求解。我们可以将问题表述为一个整数线性规划(Integer Linear Programming,ILP)问题,其中变量表示每个人分配到的职业,目标是最大化总评分,并且要满足每个人只能分配到一个职业,每个职业只能分配给一个人。

下面是举的一个例子:

        如下图是该小组五个人对于完成课程论文的任务分配工作的偏好/熟练度:

        (假设每人均有10分,分数分配极为对各工作的爱好/熟练度权重)

 如何将五个人员分配使得工作效率最高呢?

        我们利用matlab内部的0-1整数线性规划求解(具体模型概述不多赘述,直接用题目理解),将其权重矩阵代入代码中(由于代码中与上述表格内的行列倒置了,所以我们需要在输入矩阵中将excel表格倒置一下,可以手动修改也可以利用B=A'  代码倒置矩阵)

%scores矩阵为权重矩阵,每一行代表单个人的工作方向爱好权重,每一列为每个工作方向
scores = [2, 3, 2, 1, 2; 
          4, 1, 1, 3, 1;
          3, 2, 1, 1, 3;
          2, 1, 1, 2, 4;
          3, 1, 3, 2, 1];

n_people = size(scores, 1);      %行的数量
n_jobs = size(scores, 2);        %列的数量

% 创建整数线性规划模型
prob = optimproblem('ObjectiveSense', 'max');

% 创建变量,表示每个人分配到的工作方向,选中的工作为1,未选中的工作为0,即为0-1整数规划
%下述x后面是指变量矩阵,“n_people, n_jobs,”在这里是指5*5的变量矩阵,整数规划,下界为0上界为1
x = optimvar('x', n_people, n_jobs, 'Type', 'integer', 'LowerBound', 0, 'UpperBound', 1);

% 目标函数:最大化总评分
prob.Objective = sum(sum(scores .* x));

% 约束条件:每个人只能分配到一个职业
prob.Constraints.con1 = sum(x, 2) == 1;

% 约束条件:每个职业只能分配给一个人
prob.Constraints.con2 = sum(x, 1) == 1;

% 求解整数线性规划
[sol, fval, flag, out] = solve(prob);
%结果储存在sol的x里面,导出数据即可
% 输出最优的职业分配结果和总评分
disp("最优的职业分配如下:")
disp(sol.x)

total_score = fval;
disp(['总评分:', num2str(total_score)]);

matlab计算出来的结果如下:

 matlab给出的结果为人员1负责规划论文大纲,人员2负责撰写论文正文,人员3负责搜集资料,人员4负责后期检查润色论文,人员5负责撰写论文摘要前景,此时获得的总评分为16分,达到项目最高效率。

该模型可以解决多种类似工作分配问题,其人员人数与任务数量没有硬性相同的要求,例如可以计算在n个人中安排m个人完成各项工作任务(n>m)使得总效率最高。这样的话只需要将后面的约束条件改一下即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值