志愿匹配算法开发记录(三)——实现

这篇博客记录了志愿匹配算法的开发过程,包括首先按第一志愿分配,然后找出并处理超员项目,以及调整无项目学生分配的步骤。在实际操作中发现,从高志愿开始下调可能导致不满意的结果,作者计划进一步优化算法以改善匹配效果。
摘要由CSDN通过智能技术生成

匹配算法实现

思路

  1. 首先将所有学生全都分配到第一志愿中
  2. 找出超员项目中人数最多的项目,按照优先级随机抽取该项目中超过项目最大人数的学生分配到下一志愿中(为了尽可能平均先从高志愿开始下调)
  3. 如果本来就是第五志愿且被抽中下调就将分配的志愿设为-1
  4. 循环进行2,3两步,直到所有项目人数达标
  5. 最后将分配项目为-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++){
    //将多出来的同学分到下调一个志愿
                
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值