第二次结队做业

1、结队伙伴

  • 031502314柯豪燊

  • 031502306陈晓凯

2、 githuba 连接

3、inupt_data.txt数据

###数据生成原理
  • 在main函数里面输入学生人数和部门数量,例子里为150个学生,10个部门。
  • 学号:顺序编号,直接采用“031502xxx”+编号,判断编号小于10,100,1000,来前置补0。
  • 学生空闲时间:先随机产生空闲时间的个数,再从week数组(周一到周日)从随机抽取一天,从8-20随机出一个数值begintime。该算法有可能出现空闲时间相同的可能。
  • 学生申请的部门:随机数产生
  • 学生兴趣:从兴趣数组中非null的元素中随机产生,取出后该元素置为null。
    -部门的编号、活动时间、兴趣与学生的相同。java

    ###考虑的因素:
  • 随机生成具备随机性,在学生基数大时,有必定的表明性。
  • 学生空闲时间从日常大学生的平常出发,例如周六周日和工做日晚上大几率空闲,同时参照了做业博客里input_data里的数值,所以空闲时间数以13发散分布。
  • 部门的活动时间则参考了做业博客里input_data里的数量,大概设置以三、4发散分布。
  • 兴趣数量也是参考input,以5发散分布。git

4、数据建模及匹配程序的思路及实现方式

  • 数据建模:

  • beanStudent:github

    • String student_no 学号算法

    • List free_time 空闲时间数组

    • List applications_department 申请的部门app

    • List tags 我的兴趣dom

    • boolean Stu_admit 是否匹配到部门函数

  • beanDepartment:工具

    • String department_no; 部门编号代码规范

    • List event_schedules; 活动时间

    • int member_limit; 人数上限

    • List tags; 部门但愿申请者拥有的兴趣

    • boolean Dep_admit 是否匹配到学生

    • List student_no=new ArrayList<>();已录取的学生的学号

  • 匹配程序的思路及实现方式:

思路:

  • 匹配思路很简单,从部门的角度出发从头至尾遍历学生,只要学生与所申请部门的活动时间和兴趣爱好都有一项匹配、部门人数未达上限便可进入该部门。

    • 一、若是该学生有申请这个部门——进行下一步
    • 二、若是该学生的空闲时间与部门的活动时间有一个匹配——进行下一步
    • 三、若是该学生的兴趣爱好有一个和部门的同样——录取
  • 实现方式:

List<beanStudent> stu= b.getStudents();
        List<beanDepartment> dep = b.getDepartments();
        for(int i=0;i<dep.size();i++)
        {
            beanDepartment bd=dep.get(i);//得到部门对象
            for(int j=0;j<stu.size();j++)
            {
                beanStudent bs=stu.get(j);//得到学生对象
                //System.out.println(bs.getApplications_department());
                //System.out.println(bd.department_no);
                if(bs.getApplications_department().contains(bd.department_no))
                {
                    boolean Timematch=false;
                    List<String> es=bd.event_schedules;
                    List<String> ft=bs.free_time;
                    for(int k=0;k<es.size();k++)
                    {
                        String DepDay="";
                        String DepTime="";
                        for(int l=0;l<es.get(k).length();l++)
                        {
                            if(es.get(k).charAt(l)>=65&&es.get(k).charAt(l)<=122)
                            {
                                DepDay+=es.get(k).charAt(l);
                            }
                            else if(es.get(k).charAt(l)=='.')
                            {
                                continue;
                            }
                            else if(es.get(k).charAt(l)==':')
                            {
                                break;
                            }
                            else
                            {
                                DepTime+=es.get(k).charAt(l);
                            }
                        }
                        for(int n=0;n<bs.free_time.size();n++)
                        {
                            String StuDay="";
                            String StuTime="";
                            
                            for(int m=0;m<ft.get(n).length();m++)
                            {
                                if(ft.get(n).charAt(m)>=65&&ft.get(n).charAt(m)<=122)
                                {
                                    StuDay+=ft.get(n).charAt(m);
                                }
                                else if(ft.get(n).charAt(m)=='.')
                                {
                                    continue;
                                }
                                else if(ft.get(n).charAt(m)==':')
                                {
                                    break;
                                }
                                else
                                {
                                    StuTime+=ft.get(n).charAt(m);
                                }
                            }
                            if(DepDay==StuTime&&(DepTime==StuTime)||(StuTime+1==DepTime))
                             {
                                 Timematch=true;
                                 break;
                             }
                        }
                        if(Timematch=true)
                            break;
                    }    
                                    
                            List<String> tag=bd.tags;
                            for(int l=0;l<tag.size();l++)
                                if(Timematch=true&&bs.getTags().contains(tag.get(l)))
                                {
                                    if(bd.member_limit-->0)
                                    {
                                        bs.Stu_admit=true;
                                        bd.Dep_admit=true; 
                                                                        bd.student_no.add(bs.student_no);
                                    break;
                                    }
                                }
                        }
                }
            }

5、代码规范

  • 初次接触java,不少规范都不懂,命名也很随意,在队友的帮助下认识到了命名的规范

    • 类名首字母应该大写

    • 方法名首字母应该小写

    • for、if等语句的{}在前面

6、结果评估

  • 使用做业里面的input_data.txt的文件进行评测。

    • 评测结果
    • unlucky_student:156人
    • unlucky_department:0

分析:根据input_data.txt文件里部门人数的上限,必定至少剩下63个学生匹配不到部门,156/300-63/300=31%,理论上有31%的未匹配率,再加上有志愿、空闲时间、兴趣等因素决定可否匹配,70%的匹配率还能够接受,大多部门都能录取10人以上,但该算法有 很大的缺点:

  • 一、顺序遍历学生,对学号靠后的学生很不公平。
  • 二、匹配思路太过简单。

  • 改进:可设置绩点属性,对绩点、申请志愿、兴趣匹配度、空闲时间匹配度设置不一样的得分权重,权重分布可详细讨论,对于每个部门都会有一批申申请者,按分数高低进入部门,以后对unluck_student、department进行简单匹配;

7、心得体会

我的感觉

  • 此次做业让个人国庆假期不至于太过颓废,java以前有学过一点,写的都是一些很小的简单的程序,第一次用java写像这样的程序,在此次实践后,开始注重代码规范,一些本来没有意识到的知识的漏洞暴露了出来,同时也让我知道了以后前进的方向。而且学到了不少以前不会的技能

  • 了解了jason格式,以及用工具包去解析jason取jason。

  • 会用工具把java打包成.exe文件

结队体会‘

  • 国庆中秋一块儿放,很开心地放假回家了,玩啊玩,早就把做业抛到脑后了,还好队友及时点醒了我,因而咱们经过QQ在网上交流,队友解答了我关于题目的疑问,一块儿分享查找的资料,一开始对jason格式一脸茫然,后来知道用java解析比较简单,咱们俩对java都不是很精通,最后敲定用简单的匹配思路。在此次的做业里,队友提供了不少思路和点子,我以为他是一个颇有想法、思惟很活跃的好队友,此次结队很是愉快,让咱们都学到了很多东西。
相关文章
相关标签/搜索