目录
指派问题(基础):
指派系数矩阵:
转化为线性规划问题:
找到目标函数:
增加约束条件:
matlab求解线性规划问题:
intlinprog:
指派问题的函数 :
使用实例:
指派问题延伸 :
最基础的指派问题其简而言之就是
n个工人,n份工作,不同工人做不同工作各有不同的代价或效益,每个工人做一个工作,每个工作由一个人来做,求怎么分配工人代价最低或效益最高。
例如:
工人/工作 | A | B | C |
---|---|---|---|
甲 | 3 | 5 | 7 |
乙 | 1 | 3 | 4 |
丙 | 2 | 4 | 1 |
第 i 个人做第 j 个工作的代价为c_ij, 那么c_ij组成的矩阵就是指派系数矩阵
例如上述例子的指派矩阵就是. c =
引入 0 - 1变量
1 表示第 i 个人去做第 j 个工作
那么目标函数(工作的成本或代价)即为
由于每个人只做一个工作,每个工作只有一个人做,我们可以得到约束条件:
又因为是0-1变量,还有约束条件
在线性规划问题中,等价于
是整数
那么至此就构建好了线性规划模型。
使用函数: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化为矩阵
完整代码我上传资源
即一个人可做多个工作,或一个工作可由多个人来做等
思路: