• 【Alpha版本】冲刺阶段——Day 3


    我说的都队

    031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬涛


    会议时间:11月9日

    Github项目链接

    一、项目燃尽图

    二、项目进展

    已完成

    • 系负责人个人信息界面的后台实现
    • 院负责人个人信息界面的后台实现
    • 学生的专业导师初稿界面

    • (重点进度)毕设导师分配算法

    分配算法代码主体框架如下:

    学生结构体:

    struct Student {
        int student_id; // 学生编号
        int teacher_id; // 中选的导师编号
        int cur;        // 当前分配进程正在考虑第cur个志愿
        int want[5];    // 五个志愿
        float point;    // 绩点
    };
    

    导师结构体:

    struct Teacher {
        int teacher_id; // 导师编号
        int want_num;   // 期望的学生数
        int chose_num;  // 已中选的学生数
        int student_id[10]; // 中选的学生编号
    };
    

    (重点)核心分配算法类:

    class DistributeSystem {
    
    private:
        int student_number; // 学生总人数
        int teacher_number; // 导师总人数
        Student* stu;
        Teacher* tch;
    
    public:
        DistributeSystem() {
            stu = NULL;
            tch = NULL;
            student_number = 0;
            teacher_number = 0;
        }
    
        DistributeSystem(int stu_num, int tch_num, Student* student, Teacher* teacher) {
            student_number = stu_num;
            teacher_number = tch_num;
            stu = student;
            tch = teacher;
        }
    
        ~DistributeSystem() {
            delete[] stu;
            delete[] tch;
        }
    
        // 根据导师编号返回他在数组中的下标
        int get_teacher_index(int teacher_id) {
            int index;
            for (index = 0; index < teacher_number; ++index) {
                if (tch[index].teacher_id == teacher_id) {
                    break;
                }
            }
            return index;
        }
    
        // 根据学生编号返回他在数组中的下标
        int get_student_index(int student_id) {
            int index;
            for (index = 0; index < student_number; ++index) {
                if (stu[index].student_id == student_id) {
                    break;
                }
            }
            return index;
        }
    
        // 使用Gale–Shapley算法进行分配
        void distribute() {
            queue<Student> Que; //未分配到导师的学生队列
            for (int i = 0; i < student_number; ++i) {
                Que.push(stu[i]); // 初始都是未分配状态,都加进队列
            }
            while (!Que.empty()) {
                Student& s = stu[get_student_index(Que.front().student_id)];
                Que.pop();
                // 考虑学生s的第cur个志愿(导师为t)
                Teacher& t = tch[get_teacher_index(s.want[s.cur++])];
                if (t.want_num > t.chose_num) { // 如果导师t还有剩余名额,直接中选
                    t.student_id[t.chose_num++] = s.student_id;
                    s.teacher_id = t.teacher_id;
                }
                else {
                    int min_stu_id = -1; // 导师t中绩点最低的学生编号
                    int pos = -1; // 以及他在导师的中选列表中的下标
                    float min_point = 5.0;
                    for (int i = 0; i < t.chose_num; ++i) { // 在导师t中查找绩点最低的学生编号
                        Student tmp = stu[get_student_index(t.student_id[i])];
                        if (min_point > tmp.point) {
                            min_point = tmp.point;
                            min_stu_id = tmp.student_id;
                            pos = i;
                        }
                    }
                    // 如果导师t不带学生 或者 学生s的绩点比导师t所有已经中选学生的最低绩点还低,那么学生t只好再等下轮
                    if (t.want_num == 0 || s.point < min_point) {
                        if (s.cur < 5) { // 如果五个志愿还没考虑完毕的话,放入队列中继续参与分配
                            Que.push(s);
                        }
                    }
                    else { // 不然学生t就直接替换掉绩点最低的那个学生
                        Student& min_stu = stu[get_student_index(min_stu_id)];
                        min_stu.teacher_id = -1;
                        if (min_stu.cur < 5) { // 被替换掉的学生再放入未分配的队列中去
                            Que.push(min_stu);
                        }
                        t.student_id[pos] = s.student_id;
                        s.teacher_id = t.teacher_id;
                    }
                }
            }
        }
    };
    
    // 随机生成导师信息
    void generate_teacher_information(Teacher* tch, int teacher_number) {
        map<int, bool> id;
        for (int i = 0; i < teacher_number; ++i) {
            int teacher_id = GetRandom(99999); // 编号范围[00001, 99999]
                                               // 随机出一个不重复的编号才停止
            while (id[teacher_id] == true) teacher_id = GetRandom(99999);
            id[teacher_id] = true;
            tch[i].teacher_id = teacher_id;
            tch[i].want_num = rand() % 9; // 期望学生数[0, 8]
            tch[i].chose_num = 0;
        }
    }
    
    // 随机生成学生信息
    void generate_student_information(Student* stu, Teacher* tch, int student_number, int teacher_number) {
        map<int, bool> id;
        for (int i = 0; i < student_number; ++i) {
            int student_id = GetRandom(99999);
            while (id[student_id] == true) student_id = GetRandom(99999);
            id[student_id] = true;
            stu[i].student_id = student_id;
            stu[i].teacher_id = -1; // -1表示未分配到导师
            stu[i].cur = 0; // 初始都从志愿1(下标为0)开始考虑
            stu[i].point = (rand() % 401 + 100) / 100.0; // 绩点[1.0, 5.0]
            map<int, bool> m;
            for (int j = 0; j < 5; ++j) { // 生成5个志愿
                int want = rand() % teacher_number;
                while (m[want] == true) want = rand() % teacher_number;
                m[want] = true;
                stu[i].want[j] = tch[want].teacher_id;
            }
        }
    }
    

    随机生成导师信息:

    // 随机生成导师信息
    void generate_teacher_information(Teacher* tch, int teacher_number) {
        map<int, bool> id;
        for (int i = 0; i < teacher_number; ++i) {
            int teacher_id = GetRandom(99999); // 编号范围[00001, 99999]
                                               // 随机出一个不重复的编号才停止
            while (id[teacher_id] == true) teacher_id = GetRandom(99999);
            id[teacher_id] = true;
            tch[i].teacher_id = teacher_id;
            tch[i].want_num = rand() % 9; // 期望学生数[0, 8]
            tch[i].chose_num = 0;
        }
    }
    

    随机生成学生信息:

    // 随机生成学生信息
    void generate_student_information(Student* stu, Teacher* tch, int student_number, int teacher_number) {
        map<int, bool> id;
        for (int i = 0; i < student_number; ++i) {
            int student_id = GetRandom(99999);
            while (id[student_id] == true) student_id = GetRandom(99999);
            id[student_id] = true;
            stu[i].student_id = student_id;
            stu[i].teacher_id = -1; // -1表示未分配到导师
            stu[i].cur = 0; // 初始都从志愿1(下标为0)开始考虑
            stu[i].point = (rand() % 401 + 100) / 100.0; // 绩点[1.0, 5.0]
            map<int, bool> m;
            for (int j = 0; j < 5; ++j) { // 生成5个志愿
                int want = rand() % teacher_number;
                while (m[want] == true) want = rand() % teacher_number;
                m[want] = true;
                stu[i].want[j] = tch[want].teacher_id;
            }
        }
    }
    

    附:导师分配算法链接

    三、站立式会议照片

    四、查缺补漏

    今日进展 存在问题 明日安排
    王婷婷 本来打算写学生/可选导师列表,但是发现自己还不会分页,就直接先写志愿分配结果,然并没有写完 对tp框架的使用不够熟练,很多东西都是看一会写一会。果然看教程还是应该边看边写,边学边练才能扎实 把昨天没写完的志愿分配结果完成,看看分页
    许玲玲 完成了学生角色的专业导师列表 专业导师列表界面不够完善,bootstrap的框架不熟悉,而且学长的一些css和js也不懂 完善志愿分配结果,看看分页。
    胡心颖 看完了ThinkPhp5框架的基础、架构、控制器,正在看数据库 看框架的时候没注意,把第二部分一些可以暂时省略的内容当成了基础看,看的云里雾里,挣扎了半天才发现不用看 把数据库看了,模型和视图过一遍,其他的有时间就先留给印象,没时间先省略掉,看完后开始着手敲代码
    黄伟炜 继续完善了“系负责人时间界面”,看了 bootstrap 网格系统 因为之前看了 css 基础,就直接纯手敲css样式来实现界面,这样太费劲!虽然有听说过bootstrap,但是因为太懒,就没有去看使用方法。有了纯手敲css的体验,决定还是花一些时间看看bootstrap,提高一下效率 学习bootstrap,为后面的界面编写做准备
    郑扬涛 主要是在改导师分配算法,还有着手进行导师分配情况界面的设计 因为ACM的缘故,前端学习的进度较慢 打算用模拟数据测试下分配算法,然后继续进行页面设计
    陈齐民 大体完成了匹配设置界面,点击可选导师按钮,弹出可选导师的浮窗 分配算法已经实现,但是如果要实现的话还需要把算法单独写成库导入到框架中使用,但是目前不知道如何解决 完成匹配设置界面的后台功能,包括正常显示未分配到导师的学生列表和可选导师的列表,并且可以实现手动分配,完成分页功能
    陈燊 冲刺博客的撰写,项目进度的把控 运动会的到来,时间安排有点紧 根据组员的进度以及安排,继续督促相应任务的完成,把控整体进度

    五、心得体会

    陈燊

    这一次的冲刺会议,比较里程碑式的进展便是导师分配算法的完成。我们根据需求分析,然后汲取结对编程时的一些经验,确定了算法的大体思路。分配算法基本都是由ACM大神扬涛完成的,不得不感叹ACMer的强大!一个算法,分分钟就写了出来,而且基本没有BUG,有着得力的队友,作为组长真是放心。
    

    许玲玲

    虽然都是php框架,也都是MVC思想,但是不得不说差别真不少啊,之前看完的那些教程,好像基本全忘了,边看边写,总算写了点东西出来。
    

    胡心颖

    学习的时候比较赶,很多知识都是草草过一遍,记得不劳,也不透彻,虽然开始做的时候已经把知识大体上过一遍了,但估计还要反复回去学,还是要边学边做,不过好在有个印象,也稍微了解了框架的结构,日后去学习也知道去哪里学,而且组里还有两个PHP老司机,可以请教。
    

    王婷婷

    虽然都是php框架,也都是MVC思想,但是不得不说差别真不少啊,之前看完的那些教程,好像基本全忘了,边看边写,总算写了点东西出来。
    

    陈齐民

    运动会花了好多的时间,写功能的时间好少,最主要的算法实现分配的功能还不知道要如何导入到框架中实现,准备向其他的phper请教一下。
    

    郑扬涛

    就要出发去比赛了,感觉安排的事情又不能如期完成...只想说,各位队友大神们前端求带飞啊!!
    

    黄伟炜

    磨刀不误砍柴功!多花点时间熟悉前端框架的使用,可以提高编写页面的效率。
  • 相关阅读:
    PHP错误:Fatal error: session_start() 解决办法
    Flash 随机生成多个显示元件的ActionScript代码
    CMD 命令行查看端口被哪个程序占用,并根据PID值,找到相应的程序,关闭掉对应服务或进程!
    DB: 20 个数据库设计最佳实践
    ActionScript 3.0 组件!
    FLASH ActionScript 3.0 sns cocial game 开发中的定时器
    PHP 获取用户真实IP
    我想成为坐在路边鼓掌的人
    Mobile + Web 并举的Social Game开发模式
    addEventListener & removeEventListener || attachEvent & detachEvent
  • 原文地址:https://www.cnblogs.com/CSLaker/p/6052401.html
Copyright © 2020-2023  润新知