matlab求解指派问题最优解的函数

目录

指派问题(基础):

 指派系数矩阵:

转化为线性规划问题:

        找到目标函数:

        增加约束条件:

matlab求解线性规划问题:

intlinprog:

指派问题的函数🌟 :

 使用实例:

指派问题延伸 :


 

指派问题(基础):

        最基础的指派问题其简而言之就是

n个工人,n份工作,不同工人做不同工作各有不同的代价或效益,每个工人做一个工作,每个工作由一个人来做,求怎么分配工人代价最低或效益最高。

        例如:

工人/工作ABC
357
134
241

 

 指派系数矩阵:

        第 i 个人做第 j 个工作的代价为c_ij, 那么c_ij组成的矩阵就是指派系数矩阵

        例如上述例子的指派矩阵就是.           c = 

        gif.latex?%5Cbegin%7Bbmatrix%7D%203%20%26%205%20%267%20%5C%5C%201%20%263%20%264%20%5C%5C%202%26%204%26%201%20%5Cend%7Bbmatrix%7D

转化为线性规划问题:

        找到目标函数:

        引入 0 - 1变量 gif.latex?x_i_j

                1 表示第 i 个人去做第 j 个工作

        那么目标函数(工作的成本或代价)即为

                gif.latex?z%3D%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%5Csum_%7Bj%3D1%7D%5E%7Bn%7Dc_i_jx_i_j

        增加约束条件:

        由于每个人只做一个工作,每个工作只有一个人做,我们可以得到约束条件:

gif.latex?%5Csum_%7Bi%3D1%7D%5E%7Bn%7Dx_i_j%3D1%28j%3D1%2C2%2C3%2C4...%29

gif.latex?%5Csum_%7Bj%3D1%7D%5E%7Bn%7Dx_i_j%3D1%28i%3D1%2C2%2C3%2C4...%29

        又因为gif.latex?x_i_j是0-1变量,还有约束条件

gif.latex?x_i_j%3D0%20%2C1

        在线性规划问题中,等价于

gif.latex?%5Cbegin%7Bcases%7D%20%26%20%5Ctext%7B%20%7Dx_i_j%20%5Cgeq%200%20%5C%5C%20%26%20%5Ctext%7B%20%7Dx_i_j%20%5Cleq%201%5C%5C%20%26%20%5Ctext%7B%20%7D%20x_i_j%20%5Cend%7Bcases%7D是整数

        那么至此就构建好了线性规划模型。

matlab求解线性规划问题:

使用函数:intlinprog()

intlinprog:

        用于求解混合整数的线性规划问题,详细使用参见官方文档:

        混合整数线性规划 (MILP) - MATLAB intlinprog- MathWorks 中国

指派问题的函数🌟 :

        先设置基本参数和输出量

function [x,fval] = AssignmentProblem(c,flag)
%输入参数c为指派矩阵
%x输出指派问题的解
%fval输出最小成本/代价
%flag用于区分求最大效益还是最小成本,1表示求最小成本,-1表示求最大利益

        目标函数对应向量:

c=c(:);     %把矩阵转化为向量
c=flag*c;       %求最大利益需要先取负

        添加约束条件:

%构建等式条件
aeq=zeros(2*n,n^2);
beq=ones(n*2,1);
for i=1:n
    aeq(i,(i-1)*n+1:i*n)=1;
    aeq(i+n,i:n:n^2)=1;
end

        设置变量边界:

%变量边界
lb=zeros(n^2,1);
ub=zeros(n^2,1);

        求解:

[x,fval]=intlinprog(c,intcon,[],[],aeq,beq,lb,ub);
fval=flag*fval;
x=reshape(x,n,n);       %把解得的x化为矩阵

 使用实例:

完整代码我上传资源

a18aee41915a4da5a8132a0d8e29baaf.png

fa9f9c4c42cc4718b3ac5ab7b6131164.png 

指派问题延伸 :

即一个人可做多个工作,或一个工作可由多个人来做等

思路:

  • 人多工作少:添加虚拟的人,代价为0
  • 人少工作多;添加虚拟工作,代价为0
  • 一人可做多个工作:将一个人分为等价的多个人
  • 某工作不能由某人做:将对应代价设置为无穷大
  • ……

 

  • 12
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Freshman小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值