B题 员工任务分配问题

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,[]);

代码不规范,是赶工出来的,但是能用,记得拿比较好的电脑运行

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
要实现将揽件任务分配给已揽件数量最少的员工,可以使用Java编写一个分配算法。以下是一个简单的实现方案: 1. 定义揽件任务实体类 ```java public class PickupTask { private Long id; private String taskDescription; // 省略getter和setter方法 } ``` 2. 定义员工实体类 ```java public class Employee { private Long id; private String name; private int pickupCount; // 省略getter和setter方法 } ``` 3. 定义分配算法方法 ```java public Employee assignTask(List<Employee> employees, PickupTask task) { // 对员工按照已揽件数量从小到大排序 Collections.sort(employees, Comparator.comparing(Employee::getPickupCount)); // 将任务分配给揽件数量最少的员工 Employee targetEmployee = employees.get(0); targetEmployee.setPickupCount(targetEmployee.getPickupCount() + 1); return targetEmployee; } ``` 4. 测试分配算法方法 ```java public static void main(String[] args) { List<Employee> employees = new ArrayList<>(); employees.add(new Employee(1L, "Employee A", 2)); employees.add(new Employee(2L, "Employee B", 3)); employees.add(new Employee(3L, "Employee C", 1)); PickupTask task = new PickupTask(1L, "Task 1"); Employee targetEmployee = assignTask(employees, task); System.out.println("Task assigned to employee: " + targetEmployee.getName()); } ``` 以上代码仅为示例,实际开发中还需要考虑更多细节和特殊情况。另外,还可以使用更高级的算法和数据结构来优化分配效率和质量。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值