美文网首页
开放教育排课程序

开放教育排课程序

作者: Noza_ea8f | 来源:发表于2019-11-14 11:00 被阅读0次
  • “CLASSROOM_NUM = 14” 用来设置教室数
import pandas as pd
from Office_kaifang.class_arrange.data import dict_kf_classroom, dict_class_level

# 打开表格
path = '2019-2020第一学期开放教育开课一览表.xlsx'
# df = pd.read_excel(io=path, sheet_name='自开开课一览表')
df = pd.read_excel(io=path, sheet_name='网授开课一览表')
col_names_ls = df.columns.tolist()  # 获取标题行列表
col_names_ls.insert(0, '时间段')
# col_names_ls.insert(1, '教室')

# todo 提取数据结构

# todo 唯一值列表
ls_teachers = df['任课教师'].unique().tolist()
ls_courses = df['课程名称'].unique().tolist()
ls_classes = df['专业班级'].unique().tolist()


# todo 建立字典


def get_courses_dict():
    '''
    以课程为键,建立"课程:班级"字典
    :return: 返回"课程:班级"字典
    '''
    courses_dict = dict()  # 创建课程空字典
    for course in ls_courses:  # 从课程列表中取课程
        ls = []  # 创建一个空列表,用来存放班级
        for i in range(df.shape[0]):  # 从表中提取数据
            if df.iloc[i, 0] == course:  # 如果找到相同的课程名称
                d = dict()  # 创建一个空字典用来存放"班级:其它"信息字典

                # 把其它信息作为一个列表
                data_ls = []
                for j in range(2, df.shape[1]):
                    data_ls.append(df.iloc[i, j])

                d.update({df.iloc[i, 1]: data_ls})  # 加入字典
                # 把班级----其他信息字典加作为元素入列表
                ls.append(d)  # 把对应的专业班级添加进列表

        courses_dict.update({course: ls})  # 得到"课程:班级"字典
    return courses_dict


# todo 思路:通过课程,找到管理班(包含任课教师等所有信息);
# todo 从课程列表取出一门课;
# todo 该课程对应的值也就是班级列表中的每一个班在班级列表(总表)中进行查询;
# todo 如果每个值都找到了,把数据以列表的形式写入结果列表;
# todo 同时从课程总列表中弹出这个课程,从班级列表(总表)中弹出找到的班级;


def get_1_time(courses_dict, set_classes, ls_courses, set_teachers, CLASSROOM_NUM, dict_class_level):
    '''
    # 获取一个时间段数据
    :param courses_dict: 课程所对应的班级字典列表
    :param set_classes: 班级集合(总表)
    :param ls_courses: 课程列表(每一次排课需要传入刨除已成功的课程)
    :return:data_ls(一次排课数据), have_courses_set(已被安排的课程)
    '''
    # 结果数据列表
    data_ls = []
    # 已选课程集合
    have_courses_set = set()
    # 用来记录课程名称
    classes_ls_ = []
    # 初始化计数器
    COUNTER = 1
    # 从优先级课程字典取出按顺序取出课程
    for course, _ in dict_class_level.items():
        # print(course)
        if not COUNTER == 0:
            classes_ls = courses_dict[course]  # 课程所对应的班级字典列表
            # 获取班级名称集合
            classname_set = set()
            # 获取任课教师集合
            tescher_set = set()
            for class_dict in classes_ls:
                classname = list(class_dict.keys())[0]
                classname_set.add(classname)
                for k, v in class_dict.items():
                    tescher_set.add(v[0])

            # 用集合判断班级名称是否在班级列表(总表)中
            if classname_set < set_classes and tescher_set < set_teachers:
                have_courses_set.add(course)
                for class_dict in classes_ls:
                    for k, v in class_dict.items():
                        ls = []
                        ls.append(course)  # 添加课程名称
                        ls.append(k)  # 添加班级名称
                        for i in v:
                            ls.append(i)  # 添加其他信息
                        data_ls.append(ls)
                        # 记录已编排课程名称
                        classes_ls_.append(course)
                        # 列表去重
                        classes_ls_ = list(set(classes_ls_))
                        # print(classes_ls_)
                        # print(len(data_all_ls))
                set_classes = set_classes - classname_set
                set_teachers = set_teachers - tescher_set
                # dict_class_level.pop(course)  # 从优先级课程列表弹出课程
        else:
            print('教室满了')
            break
        COUNTER = len(classes_ls_) % CLASSROOM_NUM
        # print(classes_ls_)
        # print(COUNTER)
    return data_ls, have_courses_set


# 获取班级、课程名称、任课教师集合
set_classes = set(ls_classes)
set_courses = set(ls_courses)
set_teachers = set(ls_teachers)
ls_classes_ = ls_classes.copy()  # 用深度拷贝,是复制不是指针
courses_dict = get_courses_dict()  # 调用函数创建"课程:班级"字典

i = 1
data_all_ls = []
while len(set_courses) > 0:
    # print(len(set_courses))  # 如果课程长度大于零,说明课程没有被排完
    # todo 设置教室数量
    CLASSROOM_NUM = 14

    ls_courses = list(set_courses)
    # 获取排课列表
    data_ls, have_courses_set = get_1_time(courses_dict, set_classes, ls_courses, set_teachers, CLASSROOM_NUM,
                                           dict_class_level)
    # 添加时间段序号,及教室号
    class_room_num = 0
    for data in data_ls:
        data.insert(0, str(i))
        # try:
        #     data.insert(1, list(dict_kf_classroom.keys())[class_room_num])
        #     # print(data)
        # except:
        #     break
        data_all_ls.append(data)
        class_room_num += 1
    # 从课程中减去已排课程
    set_courses = set_courses - have_courses_set
    # 从优先级课程字典中弹出已排课程
    for have_course in list(have_courses_set):
        dict_class_level.pop(have_course)
    i += 1

# todo 写入Excel
data_all = pd.DataFrame(data_all_ls, columns=col_names_ls)
writer = pd.ExcelWriter('排课结果.xlsx')
data_all.to_excel(writer, '排课结果', index=False)
writer.save()
  • data.py 表中的代码及数据
# import pandas as pd

# 打开表格
# path = '2019-2020第一学期开放教育开课一览表.xlsx'
# df = pd.read_excel(io=path, sheet_name='优先级')
# #
# ls_class_name = df['课程名称'].tolist()
# ls_class_level = df['优先级'].tolist()
# #
# print(ls_class_name)
# print(ls_class_level)
# #
# dict_class_level = dict(zip(ls_class_name, ls_class_level))
# print(dict_class_level)

# 开放可用教室字典
dict_kf_classroom = {'512': 70, '机房1': 40, '机房4': 40, '机房5': 40, '机房9': 40, '机房6': 25, '机房7': 25, '机房8': 25, '机房10': 25,
                     '机房11': 25, '机房12': 25}
# print(list(dict_kf_classroom.keys())[0])
# k=list(dict_kf_classroom.keys())
# i=1
# for i in range(9):
#     print(k[i])

dict_class_level = {'办公室管理': 1, '西方行政学说': 2, '电子政务': 3, '公司法': 4, '国际经济法': 5, '国际贸易法': 6, '国际私法': 7, '商法': 8,
                    '西方行政制度': 9, '个人与团队管理': 10, '合同法': 11, '教育心理学': 12, '民法学(1)': 13, '民法学(2)': 14, '社会心理学': 15,
                    '社会学概论': 16, '学前儿童发展心理学': 17, '人力资源管理': 18, '西方经济学': 19, '管理学基础': 20, '微积分基础': 21, '金融市场': 22,
                    '机械CAD/CAM': 23, '高等数学基础': 24, '实用卫生统计学': 25, '机电一体化系统设计基础': 26, '政府经济学': 27, '经济法律基础': 28,
                    '经济法学': 29, '管理会计': 30, '企业集团财务管理': 31, '政治经济学': 32, '建筑制图基础': 33, '基础会计': 34, '金融企业会计': 35,
                    '小企业管理': 36, '建筑施工技术方案设计': 37, '经济数学基础12': 38, '数控机床': 39, '液压气动技术课程设计': 40, '液压与气压传动': 41,
                    '公共部门人力资源管理': 42, '区域经济学': 43, '国际公法': 44, '现代产权法律制度专题': 45, '知识产权法': 46, '财务管理': 47, '现代管理原理': 48,
                    '财会法规与职业道德': 49, '成本管理': 50, '企业战略管理': 51, '机械制图': 52, '计算机绘图(本)': 53, '土木工程CAD': 54, '公司概论': 55,
                    '流通概论': 56, '监督学': 57, '劳动合同法(本科)': 58, '劳动与社会保障法': 59, '刑法学(1)': 60, '刑法学(2)': 61, '金工实习': 62,
                    '人文英语1': 63, '人文英语2': 64, '人文社会科学基础': 65, '纳税筹划': 66, '行政法与行政诉讼法': 67, '幼儿游戏与玩具': 68,
                    '学前儿童健康教育': 69, '学前儿童社会教育': 70, '0-3岁婴幼儿的保育与教育': 71, '儿童家庭教育指导': 72, '学前儿童艺术教育(音乐)': 73,
                    '会计制度设计': 74, '中级财务会计(二)': 75, '中级财务会计(一)': 76, '婚姻家庭法学': 77, '幼儿园课程与活动设计': 78, '民事诉讼法学': 79,
                    '刑事诉讼法学': 80, '中国法制史': 81, '中外政治思想史': 82, '当代中国政治制度': 83, '行政领导学': 84, '宪法学': 85, '政治学原理': 86,
                    '人文英语3': 87, '心理学': 88, '管理英语1': 89, '金融学': 90, '西方经济学(本)': 91, '管理英语2': 92, '消费者权益保护法': 93,
                    '社交礼仪': 94, '中国传统文化概观': 95, '小学生心理健康教育': 96, '组织行为学': 97, '生产与运作管理': 98, '法律文书': 99, '环境资源法': 100,
                    '幼儿文学': 101, '法理学': 102, '公共行政学': 103, '社会调查研究与方法': 104, '公共关系学': 105, '教育学': 106, '电子商务概论': 107,
                    '统计学原理': 108, '理工英语1': 109, '混凝土结构设计原理': 110, '幼儿美术与手工': 111, '理工英语3': 112, '传感器与测试技术课程设计': 113,
                    '可编程控制器应用': 114, '城市管理学': 115, '学前教育学': 116, '学前儿童艺术教育(美术)': 117, '资源与运营管理': 118, '计算机应用基础(本)': 119,
                    '计算机应用基础': 120, '管理英语3': 121, '应用写作(汉语)': 122, '市场营销学': 123, '程序设计基础': 124, '金融风险管理': 125,
                    '行政组织学': 126, '公共政策概论': 127, '实用写作': 128, '数理统计': 129, '房地产经营与管理': 130, '幼儿园管理': 131}
# ls=[]
# for k, _ in dict_class_level.items():
#     print(k)
#     ls.append(k)
# dict_class_level.pop('办公室管理')
# print(ls)

相关文章

  • 开放教育排课程序

    “CLASSROOM_NUM = 14” 用来设置教室数 data.py 表中的代码及数据

  • 排课 - 爱课小程序

    排课 排课功能是馆主操作最频繁的功能之一,在这里你可以进行排课管理、查看会员约课、约课补录及取消会员约课等 排课管...

  • 易则知 | 智能排课系统功能需求及设计

    教育培训机构怎么才能做好智能排课?采用什么系统能够解决培训机构排课难的问题?怎么优化课程表的设计?传统的培训机构的...

  • 家庭系统排列之情绪管理课程之四——如何快速平复自己的情绪

    家排课程越来越接近专业词汇了,如果以前没有接触到家排课程或者亲子教育课程的话,是会感觉有些朦胧,不太理解其中...

  • 不排课就不排课

    今天是来昆明的第九天,私体开了五天了,第一天两节课,成了一单,第二天一节课,没成单,第三天,两节课(本来一节,临时...

  • 排课

    60到75分钟 最好提前十分钟到,检查教室状况。 询问会员身体状况,有没有再经期,肩颈,有没有做过手术,身体没有受...

  • 排课

    周一 周二 ** 英语 周三 周四 周五 周六 周日

  • 排课

    拜日十二式 摩天式(摩天式瑜伽可以有效的消除由于脊神经失调所引起的各种疾病。能消除腰椎间盘所承受的过度的压力,缓解...

  • 排课

    又到了排课时刻,不断的电话和聊天,终于解决了几个头疼的硬课,感谢智囊团的好主意。一个事情落地,还有一堆事情等着去处...

  • 排课

    新学期开学,我受联校领导安排,空降镇中心学校兼任教导主任。面对陌生的环境和陌生的领域,我踌躇满志。 排...

网友评论

      本文标题:开放教育排课程序

      本文链接:https://www.haomeiwen.com/subject/dralictx.html