2004年全国大学生数学建模竞赛D题
(Python源代码在文末)
问题给出
我国公务员制度已实施多年,1993年10月1日颁布施行的《国家公务员暂行条例》规定:“国家行政机关录用担任主任科员以下的非领导职务的国家公务员,采用公开考试、严格考核的办法,按照德才兼备的标准择优录用”。目前, 我国招聘公务员的程序一般分三步进行:公开考试(笔试)、面试考核、择优录取。
现有某市直属单位因工作需要,拟向社会公开招聘8名公务员,具体的招聘办法和程序如下:
公开考试:考试科目有:综合基础知识、专业知识和“行政职业能力测验”三个部分,每科满分为100分。根据考试总分的高低排序按1:2的比例(共16人)选择进入第二阶段的面试考核。
面试考核:主要考核应聘人员的知识面、对问题的理解能力、应变能力、表达能力等综合素质。按照一定的标准,面试专家组对每个应聘人员的各个方面都给出一个等级评分,从高到低分成A/B/C/D四个等级,具体结果见表1所示。
参加面试人员可申报两个工作类别志愿。工作类别分为(1)行政管理、(2)技术管理、(3)行政执法、(4)公共事业。
由招聘领导小组综合专家组的意见、笔初试成绩以及各用人部门需求确定录用名单,并分配到各用人部门。
该单位拟将录用的8名公务员安排到所属的7个部门,并且要求每个部门至少安排一名公务员。
请研究下列问题:
(1)如果不考虑应聘人员的意愿,择优按需录用,试帮助招聘领导小组设计一种录用分配方案;
(2)在考虑应聘人员意愿和用人部门的希望要求的情况下,请你帮助招聘领导小组设计一种分配方案;
(3)你的方法对于一般情况,即N个应聘人员M个用人单位时,是否可行?
(4)你对上述招聘公务员过程认为还有哪些地方值得改进,给出你的建议。
模型假设
- 专家组对应聘者的评价是公正的。
- 部门和应聘者相关数据透明。
- 应聘者4项特长指标地位等同。
- 用人部门5项基本条件对公务员影响地位同等。
符号说明
表示第i个应聘者的初试得分;
表示第i个应聘者的复试得分;
表示第i个应聘者的最后综合得分;sij表示第j个部门对第i个应聘者的综合满意度;
表示第i个应聘者对第j个部门的综合满意度;
表示第i个应聘者与第j个部门的相互综合满意度;其中i=1,2,...,16,j=1,2,...,7.
模型准备
1.量化面试成绩
专家对应聘者四项条件评分为A,B,C,D四个等级,不妨设相应评语集为{很好,好,一般,差},对应的数值为5,4,3,2.根据实际情况取近似的柯西分布隶属函数
其中α,β,a,b为待定常数。“很好”对应隶属度为1,即f(5)=1,同样“一般”对应隶属度0.8,即f(3)=0.8,“很差”对应0.01,即f(1)=0.01.
可以求出α=1.1086,β=0.8942,a=0.3915,b=0.3699.
可以得到隶属函数为
计算可知f(2)=0.5245,f(4)=0.9126,则专家组评价指标{A,B,C,D}={很好,好,一般,差}的量化值为{1,0.9126,0.8,0.5245}。可以得到评价矩阵,C=(cik)16×4。16个应聘者的综合复试得分可表示为
经计算,16名应聘人员复试分数:
应聘者 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
复试分数 | 0.9563 | 0.9282 | 0.8093 | 0.9345 | 0.9063 | 0.8374 | 0.9063 | 0.9282 |
应聘者 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
复试分数 | 0.9345 | 0.8093 | 0.8093 | 0.9282 | 0.8093 | 0.8374 | 0.9063 | 0.9063 |
2.初试分数与复试分数的规范化
为便于将初试分数与复试分数统一化比较,首先分别用极差规范化的方法做相应的规范化处理。初试得分规范化处理:
复试得分规范化处理:
3.确定应聘人员综合分数
不同用人单位对初试和复试的重视程度可能会不同,可用参数γ表示为
为了简化模型,不妨取γ=0.5,可以得到应聘人员的综合得分:
应聘者 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
综合分数 | 1 | 0.8454 | 0.4412 | 0.7787 | 0.6241 | 0.3899 | 0.5359 | 0.6101 |
排序 | 1 | 2 | 9 | 3 | 5 | 10 | 7 | 6 |
应聘者 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
综合分数 | 0.6316 | 0.2059 | 0.1471 | 0.5219 | 0.0588 | 0.1546 | 0.3594 | 0.3300 |
排序 | 4 | 13 | 15 | 8 | 16 | 14 | 11 | 12 |
模型建立与求解
问题(1)
用人单位一般不会太在意应聘人员初试分数之间的少量差异,更会注重他们的特长。根据每个部门期望条件和应聘者实际条件之间的差异,每个用人部门对每个应聘者存在一个客观的相应的评价指标,可以称之为“满意度”。
考虑特长等级分为4个级别,在对任一特长做比较时,人员的实际等级与要求等级之间,至多高或低3个等级。因此“满意度”可以分为“很不满意,不满意,不太满意,基本满意,比较满意,满意,非常满意”7个等级,构成评语集V={v1,v2,..,v16},并赋予相应的数值1~7。
应聘者某项指标等级与用人部门要求相应一致时,则认为是基本满意,可看做满意度为v4。应聘者某项等级比相应期望等级高一、二、三级分别对应满意度v5,6,7,低一、二、三级分别对应满意度v3,2,1。可以得到满意度关系表:
要求 | 应聘者 | |||
A | B | C | D | |
A | V4 | V3 | V2 | V1 |
B | V5 | V4 | V3 | V2 |
C | V6 | V5 | V4 | V3 |
D | V7 | V6 | V5 | V4 |
人们往往对不满意程度的敏感远远大于对满意程度的敏感。基于这个基本事实,可以近似采用柯西分布隶属函数:
可以令f(7)=1,f(4)=0.8,f(1)=0.01。可以求出α=2.4944,β=0.8413,a=0.3574,b=0.3046。故有:
计算可知f(2)=0.3499,f(3)=0.6514,f(5)=0.8797,f(6)=0.9449,则用人部门对应聘者各单项指标评语集量化值为(0.01,0.3499,0.6514,0.8,0.8797,0.9449,1)。
根据专家组对16名应聘者4项特长评分以及7个部门的期望要求,可以得到每一个部门对每一个应聘者的各单项指标满意度的量化值,分别记为
第j个部门对第i个应聘者综合评分为
根据“择优按需录用”原则确定最终方案。“择优”是选择综合分数较高者,“按需”是录取分配方案使得用人单位的评分尽量高。为此建立0-1整数规划模型。引进0-1决策变量
问题转化为求如下0-1整数规划模型:
求得目标函数最优值为11.9013,录取分配方案如下:
部门 | 1 | 2 | 2 | 3 | 4 | 5 | 6 | 7 |
应聘者 | 1 | 2 | 5 | 8 | 4 | 9 | 12 | 7 |
综合分数 | 1 | 0.8454 | 0.6241 | 0.6101 | 0.7787 | 0.6316 | 0.5219 | 0.5359 |
部门评分 | 0.8027 | 0.8199 | 0.7828 | 0.8027 | 0.7818 | 0.8027 | 0.7991 | 0.7619 |
问题(2)
在充分考虑应聘人员的意愿和用人部门的期望要求的情况下,寻求更好的录用分配方案。应聘人员的意愿有两个方面:对用人部门工作类别的选择意愿和对用人部门基本情况的看法,即可用应聘人员对用人部门的综合满意度来表示;用人部门对应聘人员的期望要求也用满意度来表示。一个好的录用分配方案应该是使得二者的满意度都尽量的高。
(1)确定用人部门对应聘者的满意度。用人部门对所有应聘人员的满意度与问题(1)中的式
相同,即第j个部门对第i个应聘人员的 4 项条件的综合评价满意
(2)确定应聘者对用人部门的满意度。应聘者对用人部门的满意度主要与用人部门的基本情况有关,同时考虑到应聘者所喜好的工作类别,在评价用人部门时一定会偏向于自己的喜好,即工作类别也是决定应聘者选择部门的一个因素。因此,影响应聘者对用人部门的满意度的有5项指标:福利待遇、工作条件、劳动强度、晋升机会和深造机会。
对工作类别来说,主要看是否符合自己想从事的工作,符合第一、二志愿的分别为“满意、基本满意”,不符合志愿的为“不满意”,即应聘者志愿满意程度分为{满意,基本满意,不满意}三个等级。实际中根据人们对待类别志愿的敏感程度的心理变化,在这里取隶属函数为,并要求f(1)=1,f(3)=0,即符合第一志愿时,满意度为1,不符合任一个志愿时满意度为0,简单计算解得a=4,b=0.9102,即
。
于是当用人部门的工作类别符合应聘者的第二志愿时的满意度为f(2)=0.6309,即得到评语集{满意,基本满意,不满意}的量化值为(1,0.6309,0)。这样每一个应聘者i对每个用人部门j都有一个满意度权值。(i=1,2,…,16;j=1,2,…,7),即满足第一志愿取权值为1,满足第二志愿取权值为0.6309,不满足志愿取权值为0。
对于反映用人部门基本情况的5项指标都可分为“优中差,小中大或多中少“3个等级,应聘者对各部门的评语集也为3个等级,即{满意,基本满意,不满意},类似于上面确定用人部门对应聘者满意度的方法。
首先确定用人部门基本情况的客观指标值:应聘者对7个部门的5项指标中的“优、小、多”级别认为很满意,其隶属度为1;“中”级别认为满意,其隶属度为0.6;“差、大少”级别认为不满意,其隶属度为0.1。由表实际数据可得应聘者对每个部门的各单项指标的满意度量化值,即用人部门的客观水平的评价值,具体结果如下表所列。
部门 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
1 | 1 | 0.6 | 0.6 | 1 | 1 | 0.6 | 1 |
2 | 1 | 1 | 1 | 0.1 | 0.6 | 0.6 | 0.6 |
3 | 0.6 | 0.1 | 0.6 | 0.1 | 0.6 | 0.6 | 0.1 |
4 | 1 | 1 | 0.1 | 1 | 0.6 | 0.6 | 0.1 |
5 | 0.1 | 0.1 | 1 | 1 | 0.6 | 1 | 1 |
于是,每一个应聘者对每一个部门的5个单项指标的满意度应为该部门的客观水平评价值与应聘者对该部门的满意度权值(i=1,2,…,16;j=1,2,…,7)的乘积,即
例如,应聘者1对部门5的单项指标的满意度为
由假设(3),用人部门的5项指标在应聘者对用人部门的综合评级中有同等的地位,为此可取第i个应聘者对第j个部门的综合评价满意度为
(3)确定双方的相互综合满意度。根据上面的讨论,每一个用人部门与每一个应聘者之间都有相应单方面的满意度,双方的相互满意度应由各自的满意度来确定,在此,取双方各自满意度的几何平均值为双方相互综合满意度,即
(4)确定合理的录用分配方案。最优的录用分配方案应该是使得所有用人部门和录用的公务员之间的相互综合满意度之和最大。设决策变量
于是问题可以归结为如下的0-1整数规划模型:
可以求得最终录用分配方案如下,总满意度为z=5.7009。
部门 | 1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
应聘者 | 9 | 15 | 8 | 1 | 12 | 6 | 4 | 7 |
综合满意度 | 0.7509 | 0.7428 | 0.6705 | 0.7445 | 0.6899 | 0.7121 | 0.7371 | 0.6532 |
问题(3)
对于一般情况,即N个应聘人员M(M<N)个用人单位时,如上方法都适用,但模型规模会增大。实际中用人单位不会太大,当N大到一定规模时,可以先分步处理:现根据应聘人综合分数和用人部门的评价分数择优确定录取名单,然后“按需”分配。
参考文献
司守奎,孙玺菁.Python数学建模算法与应用[M] 北京:国防工业出版社,2023
源代码
模型准备:
import numpy as np
from scipy.optimize import fsolve
import pylab as plt
f1=lambda t:[1/(1+t[0]/(1-t[1])**2)-0.01,
1/(1+t[0]/(3-t[1])**2)-0.8]
c1=fsolve(f1,[0.5,0.5]) #待定参数alpha,beta
f2=lambda t:[t[0]*np.log(3)+t[1]-0.8,
t[0]*np.log(5)+t[1]-1]
c2=fsolve(f2,[0.5,0.5]) #待定参数a,b
fx=lambda x:(1/(1+c1[0]/(x-c1[1])**2)*((x>=1)&(x<=3))+
(c2[0]*np.log(x)+c2[1])*((x>3)&(x<=5)))
x0=np.linspace(1,5,100);plt.plot(x0,fx(x0))
f2=fx(2);f4=fx(4)
print('alpha=%.4f,beta=%.4f,a=%.4f,b=%.4f\nf(2)=%.4f,f(4)=%.4f'%(c1[0],c1[1],c2[0],c2[1],f2,f4))
d0=np.loadtxt('应聘者成绩概览.txt')
d1=d0[:,0];d2=d0[:,3:]
e20=fx(d2);e21=e20.mean(1) #逐行求均值得到综合复试成绩
e2=(e21-min(e21))/(max(e21)-min(e21)) #复试成绩标准化
e1=(d1-min(d1))/(max(d1)-min(d1)) #初试成绩标准化
f=(e1+e2)/2 #计算综合得分
ind =np.argsort(-f) #从小到大排序(降序)的地址(索引)
ind[ind]=np.arange(1,len(ind)+1) #综合得分排序
#print('综合得分:\n',f);print('综合得分排序:\n',ind)
np.savetxt('综合得分.txt', f)
np.savetxt('综合复试成绩.txt', e21, '%.4f')
np.savetxt('综合得分排序.txt', ind, '%d')
#plt.show()#所求得柯西分布隶属曲线
求解(1)
import numpy as np
import cvxpy as cp
import pandas as pd
from scipy.optimize import fsolve
f1=lambda t:[1/(1+t[0]/(1-t[1])**2)-0.01,
1/(1+t[0]/(4-t[1])**2)-0.8]
c1=fsolve(f1,[0.5,0.5]) #待定参数alpha,beta
f2=lambda t:[t[0]*np.log(4)+t[1]-0.8,
t[0]*np.log(7)+t[1]-1]
c2=fsolve(f2,[0.5,0.5]) #待定参数a,b
fx=lambda x:(1/(1+c1[0]/(x-c1[1])**2)*((x>=1)&(x<=4))+
(c2[0]*np.log(x)+c2[1])*((x>4)&(x<=7)))
f=fx(np.arange(1,8))
print('alpha=%.4f,beta=%.4f,a=%.4f,b=%.4f\nf(2)=%.4f,f(3)=%.4f,f(5)=%.4f,f(6)=%.4f'
%(c1[0],c1[1],c2[0],c2[1],f[1],f[2],f[4],f[5]))
d1=np.loadtxt('应聘者成绩概览.txt');d2=np.loadtxt('部门对能力等级需求.txt')
a=d1[:,3:];b=d2[:,6:]
g=lambda x:(4*(x==0)+5*(x==-1)+6*(x==-2)+7*(x==-3)+3*(x==1)+2*(x==2)+(x>=3))
m=b.shape[0];n=a.shape[0] #m为b的行数7,n为a的行数16
s=np.zeros((n,m))
for i in range(n):
for j in range(m):
t1=g(b[j,:]-a[i,:]);t2=fx(t1)
s[i,j]=t2.mean() #计算用人部门对应聘者的评分
d=np.loadtxt('综合得分.txt')
x=cp.Variable((n,m),integer=True)#决策变量,16*7是否录取
obj=cp.Maximize(sum(cp.multiply(d,cp.sum(x,1)))#对行求和,16个人的录取情况
+cp.sum(cp.multiply(s,x)))
con=[cp.sum(x)==8,cp.sum(x,1)<=1,cp.sum(x,0)>=1,
cp.sum(x,0)<=2,x>=0,x<=1]
prob=cp.Problem(obj,con);prob.solve(solver='GLPK_MI')
print('最优值:',prob.value);print('最优解:\n',x.value)
i,j=np.nonzero(x.value)
pf0=s*x.value;pf=pf0[np.nonzero(pf0)]#提取非零评分
out=np.vstack([j+1,i+1,d[i],pf])
fid=pd.ExcelWriter('1_4.xlsx')
pd.DataFrame(s).to_excel(fid,index=None)
pd.DataFrame(out).to_excel(fid,'Sheet2',index=None)
fid._save()
(2)的代码写完再更新....qwq