匹配算法实现
思路
- 首先将所有学生全都分配到第一志愿中
- 找出超员项目中人数最多的项目,按照优先级随机抽取该项目中超过项目最大人数的学生分配到下一志愿中(为了尽可能平均先从高志愿开始下调)
- 如果本来就是第五志愿且被抽中下调就将分配的志愿设为-1
- 循环进行2,3两步,直到所有项目人数达标
- 最后将分配项目为-1的学生按顺序分配到未满员的项目中
实现代码
第一志愿分配,并得到第一个爆满项目
int maxProject=0; //最大项目号
int maxPrjStuNum=0; //最大项目人数
for(int i=0;i<stuData.length;i++){
//先把所有学生分配到第一志愿
stuData[i][5]=stuData[i][0];
projectData[stuData[i][5]][1]++;//第一志愿人数加一
if(projectData[stuData[i][5]][1]>maxPrjStuNum){
maxPrjStuNum=projectData[stuData[i][5]][1];
maxProject=stuData[i][5];
}
}
循环找出爆满项目并按志愿随机减员
while (maxPrjStuNum>projectData[maxProject][0]){
int[][] maxStus=new int[6][maxPrjStuNum];
int[] counts=new int[6];
for(int i=0;i<6;i++)counts[i]=0;
for(int i=0;i<stuData.length;i++){
//分第几志愿获取人数最多项目的学生信息
if(stuData[i][5]==maxProject){
int count=0;
for(int j=0;j<5;j++){
if(stuData[i][j]==maxProject){
//在志愿内
maxStus[j][counts[j]]=i;
counts[j]++;
count++;
break;
}
}
if(count==0){
//不在志愿内
maxStus[5][counts[5]]=i;
counts[5]++;
}
}
}
int[] stuNum=new int[6];
System.arraycopy(counts,0,stuNum,0,6);
Random r=new Random();
int random;
for(int i=0;i<maxPrjStuNum-projectData[maxProject][0];i++){
//将多出来的同学分到下调一个志愿