B题 员工任务分配问题
在某家公司中,有一系列任务需要多名员工共同完成。每个任务的完成程度都无法达到完美,存在一定程度的不满意。因此,任务分配成为一个关键问题,需要确保所有任务的总不满意程度最小。然而,由于特殊原因,任何单个任务都无法由单人完成,必须由团队协作完成,每名员工必须执行任务且只能执行一项任务。但是,员工之间的组合又会由于沟通不畅、认识不一致等原因造成负面影响。因此,如何最小化这种负面影响也是需要解决的问题。
问题1:某公司目前有100项任务,共有280名员工。每个员工在执行不同任务时的不满意程度记录在附件1的Sheet1中,某项任务不满意程度的计算方式见注2。如何分配这100项任务,才能使所有任务的不满意程度最小?
问题2:对于问题1中的任务和员工,公司还记录了任意两名员工组合执行任务时可能造成的负面影响程度,记录在附件1的Sheet2中,某项任务负面影响的计算方式见注4。如何分配这100项任务,才能使所有任务的不满意程度和负面影响之和最小?
问题3:不满意程度和负面影响的重要性对任务分配有何影响?请重新建立模型并分析。
论文要求:除了提交论文外,还需要将问题1和2的结果填入附件2:“____队号结果.xlsx”给出的表单中,便于验证。其中,“问题1结果”表单提交问题1的结果,“问题2结果”表单提交问题2的结果,两个表单的第1列为员工序号,第2列为任务序号。注意“____队号.xlsx”要修改为你自己的队号。如2024001队,则文件名为:2024001结果.xlsx。
注:
Sheet1是一个280行100列的矩阵,表示第i名员工完成第j项任务时的不满意程度。数值范围为0到10,数值越大代表不满意程度越大(针对问题1)。
当多名员工分配给同一任务时,该任务的不满意程度为这多名员工完成该任务的不满意程度的平均值。所有任务的不满意程度为这100项任务不满意程度值之和,不求平均。(针对问题1)。
Sheet2是一个280行280列的矩阵,表示第i名员工和第j名员工组合执行任务时对任务完成的负面影响程度。数值范围为1到10,数值越大代表负面影响越大(针对问题2)。
当多名员工分配给同一任务时,多人之间形成的负面影响为两两员工之间负面影响的总和,将该值作为该任务的负面影响。所有任务的负面影响为这100项任务负面影响之和。(针对问题2)。
5. 所有任务的不满意程度和负面影响之和为二者的直接总和,不考虑权重(针对问题2)。
争对此问题下列算法可以解决
思路:
建立非线性规划方程和确定其约束条件
再运用ga遗传算法求解。
噶
ga算法可以求解非线性的整数规划问题,但其运行时间较长,不能实时使用运算时间较长
ga遗传算法求解需求较大,需要较大运行空间来运行,但结果是全局最优解。
下列是我的代码可以运行,但是没有优化,可以用matlab的并行运算来加速此算法。
function f=fun1(x)
T=readtable('加入excle表格,项目和人员表格,原表格就行不用改');
C=T(2:281,2:101);
c = table2array(C);
c=c';
table=[];
rentou=[];
for i=1:100
rentoujieshou=zeros(100,280);
rentoujieshou(i,:)=1;
jieshou=zeros(100,280);
jieshou(i,:)=c(i,:);
rentou=[rentou,rentoujieshou];
table=[table,jieshou];
end
f=sum((table*x)./(rentou*x));
% x=reshape(x,[280,100]);
% a=sum(x,1);
% for i=1:100
% C(:,i)=C(:,i)/a(1);
% end
% C=C';
% wuduijiao=C*x;
% duijiao=diag(wuduijiao);
% mean=sum(duijiao(1));
% f=mean;
clear
clc
clear
nvars=280*100;
A=[];
for i=1:100
chonghe2=zeros(100,280);
chonghe2(i,:) =-1;
A=[A,chonghe2];
end
b=-2*ones(100,1);
Aeq=[];
chonghe=eye(280,280);
for i=1:100
Aeq=[Aeq,chonghe];
end
beq=ones(280,1);
lb=zeros(28000,1);
ub=ones(28000,1);
intcon=(1:28000);
x0=rand(28000,1);
[x,fval] = fmincon('fun1',x0,A,b,Aeq,beq,lb,ub,[]);
T=readtable('加入excle表格,项目和人员表格,原表格就行不用改');
C=T(2:281,2:101);
c = table2array(C);
c=c(:);
y=reshape(x0,[280,100]);
[x,fval] = ga(@fun1,nvars,A,b,Aeq,beq,lb',ub',[],intcon,[]);
代码不规范,是赶工出来的,但是能用,记得拿比较好的电脑运行