分配问题的基本内容
一般来说,分配问题的解决方法是如何将任务分配给人,以使任务完成的利润最大化(成本型利润求最小值,利润型利润求最大值)。 上述问题是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目标函数的最小值
%退出标志退出标识符
%方案编制时间: 2019年09月
%%程序主体
[m,n]=size(f; 获取%利润矩阵中的任务数和人数
每%行画一列向量
f=f ';
f=f(3360;
%结构方程的约束(每行加起来等于1。 也就是说,必须为每个任务分配一个人) )。
aeq=cell(m,m );
aeq(3360 )={Zeros(1,n ) };
aeq(eye(m,m )==1)={Ones(1,n ) };
aeq=小区2 mat (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 );
结束
%%将结果恢复为利润矩阵感知格式
x=reshape(x,n,m ) ';
测试算例
为了验证本模型的效果,给出以下测试算例进行验证。
% 4个任务,4个人完成最佳解: 8
f1=[ 6,1,3,8;
六、三、五、二;
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,exit flag ]=修改mytaskarrange2(f1 ) %输入测试的效果