duye

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、结队伙伴

  • 031502314柯豪燊

  • 031502306陈晓凯

二、 githuba 链接

三、inupt_data.txt数据

###数据生成原理
  • 在main函数里面输入学生人数和部门数量,例子里为150个学生,10个部门。

  • 学号:顺序编号,直接采用“031502xxx”+编号,判断编号小于10,100,1000,来前置补0。

  • 学生空闲时间:先随机产生空闲时间的个数,再从week数组(周一到周日)从随机抽取一天,从8-20随机出一个数值begintime。该算法有可能出现空闲时间相同的可能。

  • 学生申请的部门:随机数产生

  • 学生兴趣:从兴趣数组中非null的元素中随机产生,取出后该元素置为null。
    -部门的编号、活动时间、兴趣与学生的相同。

    考虑的因素:

  • 随机生成具有随机性,在学生基数大时,有一定的代表性。

  • 学生空闲时间从平常大学生的日常出发,例如周六周日和工作日晚上大概率空闲,同时参照了作业博客里input_data里的数值,因此空闲时间数以13发散分布。

  • 部门的活动时间则参考了作业博客里input_data里的数量,大概设置以3、4发散分布。

  • 兴趣数量也是参考input,以5发散分布。

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

  • 数据建模:

  • beanStudent:

    • String student_no 学号

    • List free_time 空闲时间

    • List applications_department 申请的部门

    • List tags 个人兴趣

    • boolean Stu_admit 是否匹配到部门

  • beanDepartment:

    • String department_no; 部门编号

    • List event_schedules; 活动时间

    • int member_limit; 人数上限

    • List tags; 部门希望申请者拥有的兴趣

    • boolean Dep_admit 是否匹配到学生

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

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

思路:

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

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

        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;
	    							}
	    						}
	    				}
	    		}
	    	}

五、代码规范

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

    • 类名首字母应该大写

    • 方法名首字母应该小写

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

六、结果评估

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

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

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

  • 1、顺序遍历学生,对学号靠后的学生很不公平。

  • 2、匹配思路太过简单。

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

七、心得体会

个人感受

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

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

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

结队体会‘

  • 国庆中秋一起放,很开心地放假回家了,玩啊玩,早就把作业抛到脑后了,还好队友及时点醒了我,于是我们通过QQ在网上交流,队友解答了我关于题目的疑问,一起分享查找的资料,一开始对jason格式一脸茫然,后来知道用java解析比较简单,我们俩对java都不是很精通,最后敲定用简单的匹配思路。在这次的作业里,队友提供了很多思路和点子,我觉得他是一个很有想法、思维很活跃的好队友,这次结队非常愉快,让我们都学到了不少东西。
posted on 2017-10-09 21:52  duye  阅读(167)  评论(0编辑  收藏  举报