1、 井冈山大学 2010年“井冈杯”数学建模竞赛 论文题目:软件公司人力资源规划模型 参赛队员:班级:数学08本(1)班 姓名:赵愈旭 班级:数学08本(1)班 姓名:吴德龙 班级:医工08本(1)班 姓名:郭 俊 2010年4月25日 软件公司人力资源规划模型 摘要 本文要解决的是一个典软件公司人力资源规划的实际问题。在公司要求的不同目标前提下,给出了不同的公司人力资源规划方案。 本文针对软件公司人力资源变动的结构性特征,分析了公司人力流动问题的特点,考虑公司内外部环境带来的不确定因素,基于不
2、同的公司目标,通过引入合理的假设,了解公司人力资源规划的各种途径,挖掘相关约束条件,运用线性规划的优化思想和方法,建立了软件公司人力资源规划模型,并应用MATLAB优化工具箱对模型求解,最终得出了一组符合公司目的的最优解。 对于问题一,为了尽量减少辞退员工,我们充分利用公司内部职员,不进行额外招聘、不招临时工,而且要尽量不从公司外招聘职员。最终得出第一年程序员、高级程序员、系统分析员的招聘人数分别为0、0、0,培训人数分别为20、25、0;第二年招聘人数分别为0、77、49,培训人数分别为20、18、0;第三年招聘人数分别为0、71、50,培训人数分别为20、21、0。 对于问题二,目的是
3、尽量减少费用,我们把额外招聘和临时工考虑在内。把减少费用认为是减少额外费用,而额外费用的构成主要有培训费、辞退费、额外招聘附加费、临时工的工资。最终得出三年来辞退员工人数为156人;相对于第一种方案,辞退员工人数增加了74人;总费用为 458000元,相对于第一种方案,费用减少了320000元。 【关键词】:线性规划 人力资源规划模型 MATLAB优化工具箱 一 问题描述 软件公司有以下三种工作岗位:程序员、高级程序员和系统分析员。公司目前已经拥有一批工作一年以上的职员,通过对未来三年的工作量预测得到了未来几年的各类职员的需求表格(如下表)
4、 类别 程序员 高级程序员 系统分析员 当前拥有 200 150 100 第一年 100 140 100 第二年 50 200 150 第三年 0 250 200 表1 当前拥有的各类职员数量及后三年需要的数量(人) 为满足这些需求,公司可以考虑以下四种人事变动途径:(1)招聘职员;(2)培训职员;(3)辞退多余职员(4)用临时工。公司出于对不同公司目标的前提下,提出问题: 问题一:如果公司的目标是尽量减少辞退职员。提出相应的招聘和培训计划。 问题二:如果公司的政策是尽量减少费用,则额外费用和辞退的职员人数将会怎样变化。 二
5、问题分析 软件公司为了满足公司职员的需要,将考虑一下四种途径:招聘职员、培训职员、辞退职员、招临时工。然而由于软件人才具有流动性强的特点,每年都会存在员工自然跳槽的事件发生。公司可与根据职员的发展潜力而对职员进行培训,也可以把一些能力不足的职员进行将等处理,而对于那些能力太差的职员,公司将采取辞退职员的措施。由于员工跳槽具有随机性,所以公司可以在任意时刻针对员工跳槽后采取额外招聘来填充缺少的职员。 对于问题一,公司的目的是尽量减少辞退公司职员。而我们先分析三类职员在未来几年的需求情况:程序员逐年减少,高级程序员、系统分析员具有逐年增加的趋势。公司为了减少辞退职员,也就是说三类职员中辞退的职
6、员总数应该取最小值。而为了达到公司的目的,就应该充分利用公司内部职员,不进行额外招聘、不招临时工,而且要尽量不从公司外招聘职员。 对于某一个岗位来说,原有的职员中会有职员进行跳槽,在招进来的新人中也有一些人会跳槽,同时,公司会对一些比较有发展潜力的职员进行培训,同样,公司也可能对一些职员进行降等处理和辞退处理。正是有了这些人事变动才构成了这一岗位职员人数的变化。 此时对于每一类职员,都有这样一个数量关系:前一年的所有职员中除去跳槽的人数+招聘的新人中除去跳槽的人数-本级培训到上一级职员的人数+下一级职员培训到本级的人数-辞退职员的人数-本级降等到下一级的职员人数+上一级降等到本级的职员人数
7、下一年的总工作职员数。 而有一些岗位上的人事变动是有一定限制的。公司根据未来几年工作量的预测而设置的一些条件,比如:需求量限制,招聘限制,培训限制。还有一些是隐含的限制条件,比如:辞退和降等的人数不能超过原有岗位人数,所有参与人事变动的岗位都必须至少为0. 通过对问题的目标函数和约束条件的挖掘,便可以得出问题一的尽量减少辞退员工方案模型。 对于问题二,公司的目的是尽量减少费用,此时不再考虑职员的多少,最终目标是尽可能减少费用。为达到这样的目的,我们可以把额外招聘和临时工考虑在内。而减少费用也可以认为是减少额外费用,而额外费用的构成主要有培训费、辞退费、额外招聘附加费、临时工的工资。相对
8、于问题一来说,问题二增加了额外招聘和临时工两个岗位,目标函数和约束条件也需要做相应的改变。 此时对于每一个岗位上的职员来说,都有这样一个数量关系:前一年所有职员中除去跳槽的人数+招聘的新人中除去跳槽的人数-本级培训到上一级职员的人数+下一级职员培训到本级的人数-辞退职员的人数-本级降等到下一级的职员人数+上一级降等到本级的职员人数+额外招聘中除去跳槽的职员人数+临时工人数=下一年的总工作人数。 同样,在某些岗位上的人事变动也是有一定限制的。第一种是公司根据未来几年工作量的预测而设置的一些条件,比如:需求量限制,招聘限制,培训限制,额外招聘限制、临时工招聘限制等。第二种是隐含的限制条件,比如
9、辞退和降等的人数不能超过原有岗位人数,所有参与人事变动的岗位都必须至少为0. 通过对问题二的目标函数和约束条件的挖掘,便可以得出问题二的尽量减少费用方案模型。 三 问题假设 1、初始状态假定。将当前拥有员工状况认定是为第一年拥有员工的起始状态,对以后两年采取相同的方式处理。 2、工资假定。假定公司对未来三年的人才需求量是根据对工作量多少的预期而参照制定的;公司新招聘的各类员工(包括正常招聘和额外招聘)与工作一年以上的员工的基本年薪相同。 3、招聘、辞退计划假定。公司的年度招聘、辞退计划时间是相对固定,不能随意变动(额外招聘除外)。比如招聘计划可采取分年度的年初招聘方式,也可以采用分
10、季(月)度的季(月)初招聘新员工。同样,辞退多余职工而采取的辞退计划将随着招聘计划的改变而改变。 4、跳槽假定。公司所有的员工都有可能跳槽,但临时工除外。 5、培训假定。假定公司对员工的培训时间在一年中的可以忽略不计;假定公司培训员工计划也是相对固定的;根据企业的不同追求目标,培训员工计划与降等使用员工计划这一对相矛盾的人事变动方案在一年中不能同时出现。 6、降等假定。假定公司降等使用员工是为满足因员工的随机跳槽,而采用的一种人事变动措施;假定公司对降等使用的员工和辞退的员工都是工作一年以上的员工,招聘的新人不参与降等;在对系统分析员的降等使用中,公司不会安排越两级降等使用,即降系统分析
11、员可以降为高级程序员使用,却不能降为程序员。 7、额外招聘假定。额外招聘是为应对因员工的随机跳槽,而采取弥补职位空缺的一种方式,这一举措与公司相对固定的招聘计划时期不同,即额外招聘与正常招聘不产生冲突。 说明:以上各种假设在本文中都适用。 四 符号说明 :计划招聘职员数 :培训员工数 :辞退员工数 :额外招聘员工数 :招用临时员工数 :跳槽员工数 :降等使用员工数 :第n年程序员的人数 :第n年高级程序员的人数 :第n年系统分析员的人数 :公司目标为尽量减少辞退职员时的辞退员工总数之和 :公司目标为尽量减少辞退职员时的额外费用之和 :公司目标为尽量减
12、少费用时的辞退员工总数之和 :公司目标为尽量减少费用时的额外费用之和 五 模型建立 1、尽量减少辞退员工方案 通过对问题的分析,为达到公司关于尽量减少辞退员工的目的,充分挖掘约束条件,得出以下目标函数与约束条件。 目标函数为: 约束条件为: 招聘人员为:; 培训人员为:; 辞退员工数为:; 辞退的额外总费用为: ; 2、尽量减少费用方案 通过对问题的分析,为达到公司关于尽量减少费用的目的,充分挖掘约束条件,得出以下目标函数与约束条件。 目标函数为: 约束条件为: 辞退员工数为:; 额外费用为: 六 模型求解 1、尽量减少辞退员
13、工方案模型求解 把所得的模型化成标准形式: 应用MATLAB优化工具箱对上式进行求解(软件程序见附录),可以建立线性规划问题的计算结果(表1)。 人数 i=1 i=2 i=3 程序员 高级程序员 系统分析员 n=0 n=1 n=2 n=0 n=1 n=2 n=0 n=1 n=2 招聘 0 0 0 0 77.1152 71.1152 0 48.7982 49.8536 培训 20 20 20 25 18.3026 21.1526 — — — 辞退 63.75 20.0000 25.0000
14、 0 0 0 0 0 0 额外 招聘 — — — — — — — — — 临时 工 — — — — — — — — — 降等 — — — 7.5 0 0 20 7.2210 8.5208 表1(注:表中横杆表示不考虑的情况,下同) 2、尽量减少费用方案模型求解 把所得的模型改写成标准形式: 应用MATLAB优化工具箱对上式进行求解(软件程序见附录),可以建立线性规划问题的计算结果(表2)。 人数 i=1 i=2 i=3 程序员 高级程序员 系统分析员 n=0 n=1
15、n=2 n=0 n=1 n=2 n=0 n=1 n=2 招聘 0 0 0 0 80 80 5.5556 50 50 培训 0 8 3.5000 0 5 7.5000 — — — 辞退 81.2500 32 41.5000 0 0 0 0 0 0 额外 招聘 0 0 0 0 0 0 0 0 0 临时 工 0 0 0 0 0 0 0 5 5 降等 — — — 2.5000 0 0 0 0 0 表2 七 模型结果分析与检验 1、尽量
16、减少辞退员工方案模型分析与检验 公司的目的是为了尽量减少辞退员工。如果要减少辞退人员,就必须在其他方面尽量少用人,可以采取以下措施:减少招聘人员,增加培训人员,增加降等人员。而人数必须是整数,考虑到需要的人数是有限的,根据计算所得数据和上面的讨论,可得以下结果。 模型最优解为: 第一年:程序员、高级程序员、系统分析员的招聘人数分别为0、0、0,培训人数分别为20、25、0,辞退人数分别为64、0、0,降等人数分别为0、7、20。 第二年:程序员、高级程序员、系统分析员的招聘人数分别为0、77、49,培训人数分别为20、18、0,辞退人数分别为20、0、0,降等人数分别为0、0、7。
17、第三年:程序员、高级程序员、系统分析员的招聘人数分别为0、71、50,培训人数分别为20、21、0,辞退人数分别为25、0、0,降等人数分别为0、0、9。 总辞退员工人数为: 辞退的额外总费用为: 2、尽量减少总费用方案模型分析与检验 公司的目的是为了尽量减少总费用,费用的构成主要有培训费、辞退费、额外招聘附加费、临时工的工资。根据公司提供的培训费用资料,尽量多培训程序员,少培训高级程序员;再根据辞退政策及公司目标,应该尽量多辞退程序员,少辞退高级程序员和系统分析员;额外招聘的收费较高,在招收范围内尽量少招;由于临时工的工资较低,可以在招收范围内尽量多招。同样人数必须是整数,考虑到
18、需要的人数是有限的,根据计算所得数据和上面的讨论,可得以下结果。 模型最优解为: 第一年:程序员、高级程序员、系统分析员的招聘人数分别为0、0、6,培训人数分别为0、0、0,辞退人数分别为82、0、0,额外招聘人数分别为0、0、0,临时工人数分别为0、0、0,降等人数分别为0、3、0。 第二年:程序员、高级程序员、系统分析员的招聘人数分别为0、80、50,培训人数分别为8、5、0,辞退人数分别为32、0、0,额外招聘人数分别为0、0、0,临时工人数分别为0、0、5,降等人数分别为0、0、0。 第三年:程序员、高级程序员、系统分析员的招聘人数分别为0、80、50,培训人数分别为4、8、0
19、辞退人数分别为42、0、0,额外招聘人数分别为0、0、0,临时工人数分别为0、0、5,降等人数分别为0、0、0。 总辞退员工数为:; 相对于第一种方案,辞退员工人数增加了:; 总费用为:; 相对于第一种方案,费用减少了:。 八 模型评价 1、模型的优缺点分析 模型优点:充分考虑了各种明显的和隐含的约束条件,应用线性规划优化思想和方法建立模型。 模型缺点:没有把工资和奖金考虑在内,导致模型得到的结果与实际存在一定的距离。没有充分考虑到人数必须是整数的特点。 2、改进方向 通过市场调查或直接联系软件公司得到各类岗位的工资和年度奖金基本情况,并在模型中充分考虑工资和年度奖金所带
20、来的影响。应用整数线性规划思想是得出的结果更加令人信服。 九 参考文献 【1】统计全球,软件公司人力资源规划的数学模型 2010-4-20 【2】贾传亮,基于鲁棒优化的人力资源规划模型研究,中国科学管理,第15卷:P21~P24,2007. 【3】冯杰,黄力伟,王勤,伊成义,数学建模原理与案例,北京:科学出版社,2007. 附录 %尽量减少辞退人员方案模型的MATLAB求解程序 %从初始年到第一年的程序 >>c=[0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.0 0.0]; >> A=[];b=[]; >>
21、 Aeq=[0.75 0.0 0.0 -1.0 0.0 -1.0 0.0 0.0 0.5 0.0;0.0 0.8 0.0 1.0 -1.0 0.0 -1.0 0.0 -1.0 0.5;0.0 0.0 0.9 0.0 1.0 0.0 0.0 -1.0 0.0 -1.0]; >> beq=[-80;-2.5;5.0]; >> vlb=[0;0;0;0;0;0;0;0;0;0];vub=[50;80;50;20;25;200;150;100;150;100]; >> [x,fval]=linprog(c,A,b,Aeq,beq,vlb,vub) Optimization terminate
22、d successfully. x = 0.0000 0.0000 0.0000 20.0000 25.0000 63.7500 0.0000 0.0000 7.5000 20.0000 fval = 63.7500 %第一年到第二年的程序 >> c=[0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.0 0.0]; >> A=[];b=[]; >> Aeq=[0.75 0.0 0.0 -1.0 0.0 -1.0 0.0 0.0 0.5 0.0;0.
23、0 0.8 0.0 1.0 -1.0 0.0 -1.0 0.0 -1.0 0.5;0.0 0.0 0.9 0.0 1.0 0.0 0.0 -1.0 0.0 -1.0]; >> beq=[-40;67;55]; >> vlb=[0;0;0;0;0;0;0;0;0;0];vub=[50;80;50;20;25;100;140;100;140;100]; >> [x,fval]=linprog(c,A,b,Aeq,beq,vlb,vub) Optimization terminated successfully. x = 0.0000 77.1152 48
24、7982 20.0000 18.3026 20.0000 0.0000 0.0000 0.0000 7.2210 fval = 20.0000 %从第二年到第三年的程序 >>>> c=[0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.0 0.0]; >> A=[];b=[]; >> Aeq=[0.75 0.0 0.0 -1.0 0.0 -1.0 0.0 0.0 0.5 0.0;0.0 0.8 0.0 1.0 -1.0 0.0 -1.0 0.0 -1.0 0.5;0.0 0.0 0
25、9 0.0 1.0 0.0 0.0 -1.0 0.0 -1.0]; >> beq=[-45;60;57.5]; >> vlb=[0;0;0;0;0;0;0;0;0;0];vub=[50;80;50;20;37.5;50;200;150;200;150]; >> [x,fval]=linprog(c,A,b,Aeq,beq,vlb,vub) Optimization terminated successfully. x = 0.0000 71.1152 49.8536 20.0000 21.1526 25.0000
26、0.0000 0.0000 0.0000 8.5208 fval = 25.0000 %尽量减少费用方案模型的MATLAB求解程序 %从初始年到第一年程序 >> c=[0 0 0 4000 5000 2000 5000 5000 15000 20000 30000 5000 4000 4000 0 0]; >> A=[0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0]; >> b=[15]; >> Aeq=[0.75 0 0 -1 0 -1 0 0 0.75 0 0 1 0 0 0.5 0;0 0.8 0 1 -1
27、0 -1 0 0 0.8 0 0 1 0 -1 0.5;0 0 0.9 0 1 0 0 -1 0 0 0.9 0 0 1 0 -1]; >> beq=[-80;-2.5;5]; >> vlb=zeros(16,1); >> vub=[50;80;50;20;25;200;150;100;15;15;15;5;5;5;150;100]; >> [x,fval]=linprog(c,A,b,Aeq,beq,vlb,vub) Optimization terminated successfully. x = 0.0000 0.0000 5.5556
28、 0.0000 0.0000 81.2500 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 2.5000 0.0000 fval = 1.6250e+005 %从第一年到第二年程序 >> c=[0 0 0 4000 5000 2000 5000 5000 15000 20000 30000 5000 4000 4000 0 0]; >> A=[0 0 0 0 0 0 0 0
29、1 1 1 0 0 0 0 0]; >> b=[15]; >> Aeq=[0.75 0 0 -1 0 -1 0 0 0.75 0 0 1 0 0 0.5 0;0 0.8 0 1 -1 0 -1 0 0 0.8 0 0 1 0 -1 0.5;0 0 0.9 0 1 0 0 -1 0 0 0.9 0 0 1 0 -1]; >> beq=[-40;67;55]; >> vlb=zeros(16,1); >> vub=[50;80;50;20;25;100;140;100;15;15;15;5;5;5;140;100]; >> [x,fval]=linprog(c,A,b,Aeq,beq,
30、vlb,vub) Optimization terminated successfully. x = 0.0000 80.0000 50.0000 8.0000 5.0000 32.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 5.0000 0.0000 0.0000 fval = 1.4100e+005 %从第二年到第三年程序 >> c=[0
31、0 0 4000 5000 2000 5000 5000 15000 20000 30000 5000 4000 4000 0 0]; >> A=[0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0]; >> b=[15]; >> Aeq=[0.75 0 0 -1 0 -1 0 0 0.75 0 0 1 0 0 0.5 0;0 0.8 0 1 -1 0 -1 0 0 0.8 0 0 1 0 -1 0.5;0 0 0.9 0 1 0 0 -1 0 0 0.9 0 0 1 0 -1]; >> beq=[-45;60;57.5]; >> vlb=zeros(16,1); >>
32、 vub=[50;80;50;20;37.5;50;200;150;15;15;15;5;5;5;200;150]; >> [x,fval]=linprog(c,A,b,Aeq,beq,vlb,vub) Optimization terminated successfully. x = 0.0000 80.0000 50.0000 3.5000 7.5000 41.5000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 5.0000 0.0000 0.0000 fval = 1.5450e+005






