2006年研究生建模D题 学生面试问题
高校自主招生是高考改革中的一项新生事物,现在仍处于探索阶段。某高校拟在全面衡量考生的高中学习成绩及综合表现后再采用专家面试的方式决定录取与否。该校在今年自主招生中,经过初选合格进入面试的考生有N人,拟聘请老师M人。每位学生要分别接受4位老师(简称该学生的“面试组”)的单独面试。面试时,各位老师独立地对考生提问并根据其回答问题的情况给出评分。由于这是一项主观性很强的评价工作,老师的专业可能不同,他们的提问内容、提问方式以及评分习惯也会有较大差异,因此面试同一位考生的“面试组”的具体组成不同会对录取结果产生一定影响。为了保证面试工作的公平性,组织者提出如下要求:
Y1. 每位老师面试的学生数量应尽量均衡;
Y2. 面试不同考生的“面试组”成员不能完全相同;
Y3. 两个考生的“面试组”中有两位或三位老师相同的情形尽量的少;
Y4. 被任意两位老师面试的两个学生集合中出现相同学生的人数尽量的少。
请回答如下问题:
问题一:设考生数N已知,在满足Y2条件下,说明聘请老师数M至少分别应为多大,才能做到任两位学生的“面试组”都没有两位以及三位面试老师相同的情形。
问题二:请根据Y1~Y4的要求建立学生与面试老师之间合理的分配模型,并就N=379,M=24的情形给出具体的分配方案(每位老师面试哪些学生)及该方案满足Y1~Y4这些要求的情况。
问题三:假设面试老师中理科与文科的老师各占一半,并且要求每位学生接受两位文科与两位理科老师的面试,请在此假设下分别回答问题一与问题二。
问题四:请讨公平性论考生与面试老师之间分配的均匀性和面试公平性的关系。为了保证面试的,除了组织者提出的要求外,你们认为还有哪些重要因素需要考虑,试给出新的分配方案或建议。
解题思路
符号说明
第一问
我们通过组合数学中的均衡不完全组设计可以推导出:
问题一希望我们在考生数N已知,且满足Y2条件下,求出能使任两位学生的“面试组”都没有两位以及三位面试老师相同的情况下,聘请老师数M的最小值。这是一个单目标的规划问题。其中,如何表示老师和学生之间的关系至关重要,因此我们引入一个0-1变量x_{ij}来描述第i个学生是否被第j个老师面试:
x
i
j
=
{
0
(
学生
i
未被老师
j
面试
)
1
(
学生
i
被老师
j
面试
)
x_{ij}=\left\{ \begin{array}{c} 0\,\,\,\,\left( \text{学生}i\text{未被老师}j\text{面试} \right)\\ 1\,\,\,\,\left( \text{学生}i\text{被老师}j\text{面试} \right) \,\,\,\,\\ \end{array} \right.
xij={0(学生i未被老师j面试)1(学生i被老师j面试)
根据题目条件,我们概括出以下几个约束条件:
(1) 面试组老师人数限制:
每位学生要接受4位老师组成的面试组的面试,即需要满足:
∑
j
=
1
M
x
i
j
=
4
(
i
=
1
,
2
,
.
.
.
,
N
)
\sum_{j=1}^M{x_{ij}=4}\,\,\left( i=1,2,...,N \right)
j=1∑Mxij=4(i=1,2,...,N)
(2) 面试组成员不能完全相同的约束:
要满足Y2:面试不同考生的“面试组”成员不能完全相同的条件,意味着从老师人数中取4的组合数不能低于学生人数,即满足:
C
M
4
≥
N
C_{M}^{4}\ge N
CM4≥N
(3) 任两位学生不存在两位相同面试老师的约束:引入0-1变量x_{ij}后,我们得到一个N\times M的0-1矩阵。要避免任意两位学生出现两位相同面试老师的情况,只需要任意两行同列元素对应相乘的结果不超过1,即:
∑
j
=
1
M
x
i
j
x
k
j
≤
1
(
i
,
k
=
1
,
2
,
.
.
.
,
N
)
\sum_{j=1}^M{x_{ij}x_{kj}\le 1}\,\,\left( i,k=1,2,...,N \right)
j=1∑Mxijxkj≤1(i,k=1,2,...,N)
容易发现,在约束(3)满足的情况下,任意两位学生的面试组成员不可能完全相同,即约束(2)一定成立。故只需满足约束(1)和约束(3)即可。
最后,由于目标是希望聘请老师的人数最少,故建立出避免任两位学生有两位面试老师相同的的聘请模型如下:
min
M
\min\text{\,\,}M
minM
{
∑
j
=
1
M
x
i
j
=
4
∑
j
=
1
M
x
i
j
x
k
j
≤
1
x
i
j
∈
{
0
,
1
}
(
i
,
k
=
1
,
2
,
.
.
.
,
N
j
=
1
,
2
,
.
.
.
M
)
\left\{ \begin{array}{c} \sum_{j=1}^M{x_{ij}=4}\\ \sum_{j=1}^M{x_{ij}x_{kj}\le 1}\\ x_{ij}\in \left\{ 0,1 \right\}\\ \end{array}\,\,\left( \begin{array}{c} i,k=1,2,...,N\\ j=1,2,...M\\ \end{array} \right) \right.
⎩⎪⎨⎪⎧∑j=1Mxij=4∑j=1Mxijxkj≤1xij∈{0,1}(i,k=1,2,...,Nj=1,2,...M)
避免三位老师相同的方法相似
对此我们给出的解题步骤是给定M求最大N,最后给出M和N的对应表。
clear;clc;
M = 4:70; %老师人数
N = []; %对应的面试学生人数
for i = 1: length(M)
disp(M(i));
n = M2N(M(i),1);%求M对应的N
N = [N,n];
end
function N = M2N(M, k)
S = nchoosek(1:M,4);
i = 1;
while i < size(S,1)
j = i+1;
index = [];
while j <= size(S,1)
temp = intersect(S(i,:),S(j,:));
if length(temp) > k %面试组相同老师数超过k
index = [index, j];
end
j = j+1;
end
S(index,:) = [];
i = i+1;
end
N = size(S,1);
得出来的结果如下:
第二问
clear;clc;
load('S.mat');
num = [];
for i =1:24
num(i) = length(find(S == i));
end
x = zeros(378,24);
for i=1:378
for j=1:4
x(i,S(i,j))=1;
end
end
t = x'*x;
S1 = [S;[9,10,11,13]];
num1 = [];
for i =1:24
num1(i) = length(find(S1 == i));
end
x1 = zeros(378,24);
for i=1:379
for j=1:4
x1(i,S1(i,j))=1;
end
end
t1 = x1'*x1;
Y1 = [];Y3 = [];
for i = 1:24
Y1(i) = t1(i,i);
t1(i,i) = 0;
end
Y4 = max(t1);
b = x1*x1';
for i = 0:3
Y3(i+1) = length(find(b == i));
end
Y3 = Y3./2;
如第一题的表格可得24个老师最多能面试378个学生,且此时Y1-Y4的符合情况都比较好,这时在任意选一组都近似是问题二的最优解。
结果:
第三问
第三问增加了文理科限制,其实做法也是和一二问相同,就是在一二问的之前先做文理科的筛选。
3.1
结果如下所示
3.2
和第二问方法相似,24位老师在没有三位老师相同的情况下最多能面试301位学生,还差78位学生。这时就不能任选78个面试组了。
对此我们提出以下筛选策略:
clear;clc;
load('S_Q3.mat');
data = nchoosek(1:24,4);
%将已有的组合从总组合中删去
for i =1:size(S,1)
temp = repmat(S(i,:),size(data,1),1);
index = temp == data;
index = all(index,2);
index = find(index == 1);
data(index,:) = [];
end
%按文理科条件筛选
i = 1;
while i<size(data,1)
mid = 12;
if sum(data(i,:)<=mid)~=2
data(i,:) = [];
else
i = i+1;
end
end
for i =1 :78
disp(i);
data1 = filter_y1(S,data); %按y1筛选
data2 = filter_y4(S,data1); %按y2筛选
data3 = filter_y3(S,data2); %y3筛选
S = [S;data3];
%删除已添加组合
temp = repmat(data3,size(data,1),1);
index = temp == data;
index = all(index,2);
index = find(index == 1);
data(index,:) = [];
end
trans4_24函数:
function A = trans4_24(S)
A = zeros(size(S,1),24);
for i = 1:size(S,1)
for j =1:4
A(i,S(i,j)) = 1;
end
end
end
filter_y1函数:
function data1 = filter_y1(S,data)
index = [];
for i =1: size(data,1)
S1 = [S;data(i,:)];
A = trans4_24(S1);
B = A'*A;
t_num = diag(B);
if (max(t_num) - min(t_num))<=2
index = [index,i];
end
end
data1 = data(index,:);
end
filter_y3函数:
function data3 = filter_y3(S,data2)
A = trans4_24(S);
C = A*A';
Y3 = [];
for i = 0:4
Y3(i+1) = length(find(C ==i));
end
yy = [];
for i = 1:size(data2,1)
S1 = [S;data2(i,:)];
A1 = trans4_24(S1);
C1 = A1*A1';
Y31 = [];
for i = 0:4
Y31(i+1) = length(find(C1 ==i));
end
y = Y31 - Y3;
yy = [yy;y];
end
yy = yy - min(yy);
res = yy(:,2)*0.5 + yy(:,3)*2 + yy(:,4)*3;
index = find(res == min(res));
data3 = data2(index(1),:);
end
filter_y4函数:
function data2 = filter_y4(S, data1)
A = trans4_24(S);
B = A'*A;
B(logical(eye(size(B)))) = 0;
num0 = max(max(B));
change = [];
for i =1:size(data1,1)
S1 = [S;data1(i,:)];
A1 = trans4_24(S1);
B1 = A1'*A1;
B1(logical(eye(size(B1)))) = 0;
num = max(max(B1));
change(i) = num- num0;
end
index = find(change == min(change));
data2 = data1(index,:);
end
结果如下:
第四问
参考Y1-Y4给出关于公平性和均匀性的考虑,并给出相关建议就好。
下面是我们的建议: