第二次結隊做業

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都不是很精通,最後敲定用簡單的匹配思路。在此次的做業裏,隊友提供了不少思路和點子,我以爲他是一個頗有想法、思惟很活躍的好隊友,此次結隊很是愉快,讓咱們都學到了很多東西。
相關文章
相關標籤/搜索