欢迎访问成都少强软件技术有限公司网站
当前位置
首页 > 技术资讯 > 少强资讯
少强教务用DeepSeek R1 实现优先课点排课
2025-03-12 22:46:33

少强教务用DeepSeek R1 实现优先课点排课

问题描述: 某个大型中职学校是一个在2025高一高二的春季的排课需求中,因教师在周五下午一二节老师不排课教师人比较多,128个班级可以排课教师只有138名教师,排课教师提高率为1.09,几次按班级序列的正常排课,周五下午12节都出现课冲,不是人员不可排就是排课冲突。根据这次情况,我们决定进行优先课点排课,先把每个班级的周五下午12节提前预先排定。预先排定的数据和规则如下:

1) 预排班级编号数据列表,

2) 预排可用教师数据列表,

3) 每个班级的任课教师列表。

要求,每个班级排定一名任课范围内的教师,并且教师在可用教师数据列表之中。排定的任课教师不能有重复。排定完成后提供班级教师的排课列表,如有班级安排不下,请修改班级列表。

看来我们要启动DeepSeek AI 的强大的算法和代码生成功能来协助我们完成此次任务,具体操作如下:

1) excel 温江提供我们的三中数据列表。

2,提交我们的需求:

 

提交后,Deepseek 进行了深度的思考。。。

好的,用户希望根据提供的Excel文件生成一个班级监考表,满足三个要求:每个班级有一名监考教师,监考教师必须是该班级的任课教师,且监考教师不能重复,同时确保每个班级都有监考教师。首先,我需要理清数据结构和逻辑步骤。

C#的代码是33秒后就生成了,并提供了比较合理的算法,我们在VS2022的版本中允许了程序,效果比较满意。接下来,我们就是首先采用了DeepSeek 提供的排课算法,去完整了我们项目中的优先课点算法。

1) 先用班级循环对每个班级进行第一次的分配老师,

2) 如第一次循环未分配道老师的班级进行对预先安排好教师的班级进行替换和二次排定。

3) 结束排课,分别列出班级排课和未排课班级。

根据实际的情况,我们在项目的代码中增加了其他的排课约束条件和已经有固定课程的班级。实现了123个班级的排课和5个未排定的班级。在此过程中,我们重新反馈学校,以便提供更多的备选教师,满足周五下午排课需要。

 

附件一: Deepseek 的思考过程:

好的,用户希望根据提供的Excel文件生成一个班级监考表,满足三个要求:每个班级有一名监考教师,监考教师必须是该班级的任课教师,且监考教师不能重复,同时确保每个班级都有监考教师。首先,我需要理清数据结构和逻辑步骤。

首先,检查用户提供的Excel文件内容。有三个工作表:

1. **班级编号**:包含班级编号列表。

2. **教师编号**:包含有效的教师编号列表。

3. **班级任课教师编号**:每个班级对应多个任课教师,以逗号分隔的字符串形式存在。

接下来需要解决的问题是:

1. **如何为每个班级分配唯一的监考教师**:需要遍历每个班级,从他们的任课教师列表中选取一个未被其他班级使用的教师。

2. **确保所有班级都有监考教师**:需要处理可能出现的任课教师列表中的教师已被分配完毕的情况,这时可能需要调整分配策略或提示错误。

3. **数据验证**:需要确保任课教师编号在教师编号列表中有效,避免使用无效的教师编号。

可能的挑战包括:

- **数据格式问题**:任课教师编号列中的字符串需要正确分割并转换为整数列表。

- **教师重复分配**:需要维护一个已分配教师的集合,防止重复。

- **教师资源不足**:如果任课教师数量不足以覆盖所有班级,需要处理这种情况。

需要验证的步骤:

1. **读取并解析数据**:确保正确读取每个工作表的内容,特别是任课教师列表的解析。

2. **分配逻辑**:确保每个班级都能找到一个可用的监考教师,并且在资源不足时有相应的处理机制。

3. **输出结果**:生成符合要求的监考表,并妥善保存。

可能的错误场景:

- **无效的教师编号**:任课教师列表中存在不在教师编号列表中的编号,需要过滤掉这些无效编号。

- **班级无有效任课教师**:某个班级的任课教师列表中没有有效的教师,导致无法分配监考教师。

- **教师资源不足**:总的可用教师数量少于班级数量,导致部分班级无法分配监考教师。

针对这些情况,可以采取以下措施:

- **过滤无效教师编号**:在分配监考教师前,先检查任课教师是否在有效教师列表中。

- **动态调整分配顺序**:可能通过不同的遍历顺序(如优先分配任课教师较少的班级)来优化分配成功率。

- **错误提示**:在无法为某个班级分配监考教师时,记录并提示该班级信息,以便后续处理。

现在需要将这些逻辑转化为具体的代码实现,并验证其正确性。确保代码能够处理各种边界情况,并生成符合要求的监考表。

附件二:实现特点:

  1. 数据验证
    • 过滤无效教师编号(包括0和不在教师列表中的编号)
    • 处理异常数据(如空值或格式错误)
  2. 分配策略
    • 第一轮直接分配:按顺序为每个班级分配第一个可用教师
    • 第二轮回溯分配:对未分配班级尝试替换已有分配,最大化利用率
    • 记录分配失败的班级
  3. 输出处理
    • 生成规范的Excel表格
    • 明确提示未分配的班级(如果有)

使用说明:

  1. 将代码与Excel文件放在同一目录
  2. 运行代码后会自动生成「班级监考表.xlsx
  3. 控制台会显示分配失败的班级(如果有)

优化点:

  • 优先为任课教师较少的班级分配,降低冲突概率(可在预处理阶段对班级按任课教师数量排序)
  • 支持多种分配算法(如匈牙利算法),但需权衡实现复杂度
  • 可扩展为多考场时间安排,增加时间维度

注意事项:

  1. 确保Excel文件中无重复班级编号
  2. 教师编号需严格匹配(包括数据类型)
  3. 如果存在大量分配失败,可能需要扩增教师资源或调整任课安排

此方案在保证功能需求的前提下,提供了健壮的错误处理机制,能应对实际数据中常见的异常情况。

附件三 C#代码:

 

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using OfficeOpenXml;

class Program

{

    static void Main(string[] args)

    {

        // 设置EPPlusLicenseContext

        ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

 

        // 读取Excel文件

        string filePath = "工作簿1.xlsx";

        using (var package = new ExcelPackage(new FileInfo(filePath)))

        {

            // 读取班级编号

            var classSheet = package.Workbook.Worksheets["班级编号"];

            var classIds = classSheet.Cells["A2:A" + classSheet.Dimension.End.Row]

                .Select(c => Convert.ToInt32(c.Text))

                .ToList();

 

            // 读取教师编号

            var teacherSheet = package.Workbook.Worksheets["教师编号"];

            var teacherIds = teacherSheet.Cells["A2:A" + teacherSheet.Dimension.End.Row]

                .Select(c => Convert.ToInt32(c.Text))

                .ToHashSet();

 

            // 读取班级任课教师列表

            var ctSheet = package.Workbook.Worksheets["班级任课教师编号"];

            var classTeacherMap = new Dictionary>();

            for (int row = 2; row <= ctSheet.Dimension.End.Row; row++)

            {

                int classId = Convert.ToInt32(ctSheet.Cells[row, 1].Text);

                var teachers = ctSheet.Cells[row, 2].Text

                    .Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)

                    .Select(t => Convert.ToInt32(t))

                    .Where(t => teacherIds.Contains(t)) // 过滤无效教师编号

                    .ToList();

                classTeacherMap[classId] = teachers;

            }

 

            // 分配监考教师

            var assignedTeachers = new HashSet();

            var examSchedule = new List>();

            var failedClasses = new List();

 

            foreach (var classId in classIds)

            {

                if (classTeacherMap.TryGetValue(classId, out var teachers))

                {

                    var availableTeacher = teachers.FirstOrDefault(t => !assignedTeachers.Contains(t));

                    if (availableTeacher != 0)

                    {

                        examSchedule.Add(Tuple.Create(classId, availableTeacher));

                        assignedTeachers.Add(availableTeacher);

                    }

                    else

                    {

                        failedClasses.Add(classId);

                    }

                                else

                {

                    failedClasses.Add(classId);

                }

            }

            // 处理未分配班级(尝试回溯分配)

            foreach (var classId in failedClasses.ToList())

            {

                if (classTeacherMap.TryGetValue(classId, out var teachers))

                {

                    foreach (var teacher in teachers)

                    {

                        // 查找已分配但可替换的教师

                        var existingAssignment = examSchedule.FirstOrDefault(e => e.Item2 == teacher);

                        if (existingAssignment != null)

                        {

                            var originalClassId = existingAssignment.Item1;

                            var originalTeachers = classTeacherMap[originalClassId];

                            var alternativeTeacher = originalTeachers.FirstOrDefault(t => !assignedTeachers.Contains(t));

 

                            if (alternativeTeacher != 0)

                            {

                                // 替换原分配

                                examSchedule.Remove(existingAssignment);

                                examSchedule.Add(Tuple.Create(originalClassId, alternativeTeacher));

                                assignedTeachers.Add(alternativeTeacher);

 

                                // 分配当前班级

                                examSchedule.Add(Tuple.Create(classId, teacher));

                                assignedTeachers.Add(teacher);

 

                                failedClasses.Remove(classId);

                                break;

                            }

                        }

                    }

                }

            }

 

            // 输出结果

            if (failedClasses.Any())

            {

                Console.WriteLine("警告:以下班级无法分配监考教师: " + string.Join(", ", failedClasses));

            }

 

            // 生成监考表

            var examScheduleSheet = package.Workbook.Worksheets.Add("监考表");

            examScheduleSheet.Cells[1, 1].Value = "班级编号";

            examScheduleSheet.Cells[1, 2].Value = "监考教师编号";

 

            for (int i = 0; i < examSchedule.Count; i++)

            {

                examScheduleSheet.Cells[i + 2, 1].Value = examSchedule[i].Item1;

                examScheduleSheet.Cells[i + 2, 2].Value = examSchedule[i].Item2;

            }

            // 保存文件

            package.SaveAs(new FileInfo("班级监考表.xlsx"));

            Console.WriteLine("监考表已生成,保存为 班级监考表.xlsx");

        }

    }

}

联系方式
CONTACT US

电话:152 2895 5958

邮箱:fuchengw@qq.com

网址:http://www.shaosoft.com

地址:成都市温江区和盛镇星艺大道90号

关闭
用手机扫描二维码关闭