java排课算法简单demo

简化的场景设定

  • 有限的教室数量。
  • 每个教师可以教授多个课程。
  • 每个课程在一个特定的时间段内只能安排一次。
  • 考虑教室容量和课程需求。

Java代码实现

首先,我们定义几个基本的类:CourseTeacherRoomTimeSlot

复制代码
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class Course {
    String name;
    Teacher teacher;
    int studentCount;

    public Course(String name, Teacher teacher, int studentCount) {
        this.name = name;
        this.teacher = teacher;
        this.studentCount = studentCount;
    }
}

class Teacher {
    String name;
    List<Course> courses;

    public Teacher(String name) {
        this.name = name;
        this.courses = new ArrayList<>();
    }

    void addCourse(Course course) {
        this.courses.add(course);
    }
}

class Room {
    String roomNumber;
    int capacity;

    public Room(String roomNumber, int capacity) {
        this.roomNumber = roomNumber;
        this.capacity = capacity;
    }
}

class TimeSlot {
    String day;
    String time;

    public TimeSlot(String day, String time) {
        this.day = day;
        this.time = time;
    }
}

class ScheduleEntry {
    Course course;
    Room room;
    TimeSlot timeSlot;

    public ScheduleEntry(Course course, Room room, TimeSlot timeSlot) {
        this.course = course;
        this.room = room;
        this.timeSlot = timeSlot;
    }
}

public class Scheduler {
    List<Course> courses;
    List<Teacher> teachers;
    List<Room> rooms;
    List<TimeSlot> timeSlots;
    List<ScheduleEntry> schedule;

    public Scheduler(List<Course> courses, List<Teacher> teachers, List<Room> rooms, List<TimeSlot> timeSlots) {
        this.courses = courses;
        this.teachers = teachers;
        this.rooms = rooms;
        this.timeSlots = timeSlots;
        this.schedule = new ArrayList<>();
    }

    public void createSchedule() {
        Map<Teacher, List<TimeSlot>> teacherAvailability = new HashMap<>();
        for (Teacher teacher : teachers) {
            teacherAvailability.put(teacher, new ArrayList<>(timeSlots));
        }

        for (Course course : courses) {
            for (Room room : rooms) {
                if (room.capacity >= course.studentCount) {
                    for (TimeSlot timeSlot : teacherAvailability.get(course.teacher)) {
                        schedule.add(new ScheduleEntry(course, room, timeSlot));
                        teacherAvailability.get(course.teacher).remove(timeSlot);
                        break;
                    }
                    break;
                }
            }
        }
    }

    public void printSchedule() {
        for (ScheduleEntry entry : schedule) {
            System.out.println("Course: " + entry.course.name + " in Room: " + entry.room.roomNumber +
                               " at " + entry.timeSlot.day + " " + entry.timeSlot.time + " by Teacher: " + entry.course.teacher.name);
        }
    }

    public static void main(String[] args) {
        List<Course> courses = new ArrayList<>();
        List<Teacher> teachers = new ArrayList<>();
        List<Room> rooms = new ArrayList<>();
        List<TimeSlot> timeSlots = new ArrayList<>();

        Teacher teacher1 = new Teacher("Dr. Smith");
        Teacher teacher2 = new Teacher("Dr. Jones");
        teachers.add(teacher1);
        teachers.add(teacher2);

        Course course1 = new Course("Math 101", teacher1, 30);
        Course course2 = new Course("Physics 101", teacher2, 25);
        courses.add(course1);
        courses.add(course2);

        teacher1.addCourse(course1);
        teacher2.addCourse(course2);

        Room room1 = new Room("101A", 50);
        Room room2 = new Room("102B", 30);
        rooms.add(room1);
        rooms.add(room2);

        TimeSlot slot1 = new TimeSlot("Monday", "9AM-11AM");
        TimeSlot slot2 = new TimeSlot("Tuesday", "10AM-12PM");
        timeSlots.add(slot1);
        timeSlots.add(slot2);

        Scheduler scheduler = new Scheduler(courses, teachers, rooms, timeSlots);
        scheduler.createSchedule();
        scheduler.printSchedule();
    }
}

说明

  1. 类定义 :定义了Course, Teacher, Room, TimeSlot, 和 ScheduleEntry类来表示课程、教师、教室、时间段和排课条目。
  2. 排课逻辑 :在createSchedule()方法中,我们尝试为每个课程找到一个合适的教室和时间段。我们假设每个教师在所有时间段都可用,这显然是非常简化的。
  3. 输出printSchedule()方法打印出排课结果。

这个例子非常基础,实际应用中排课算法会更复杂,需要处理更多的约束和优化问题。

相关推荐
指掀涛澜天下惊2 分钟前
强化学习进阶篇八 策略梯度算法
深度学习·学习·算法·强化学习
平头哥技术团队7 分钟前
Day 10 | 工欲善其事:VS Code 配置与项目归档
android·开发语言·前端·javascript·html·交互
pnoker7 分钟前
IoT DC3 概念解读:把设备抽象成一套语义模板——位号、指令、事件与面向智能体的设备建模
java·人工智能·物联网·iot·dc3
乌萨奇也要立志学C++7 分钟前
【洛谷】kmp算法
开发语言·算法
my_realmy8 分钟前
Java SE 基础学习笔记(一):面向对象、继承多态、抽象接口与异常(JDK 8)
java·多线程·并发··生产者消费者模式
禹凕16 分钟前
Dijkstra算法详解与应用
python·算法
传奇开心果编程22 分钟前
【Rust入门知识点学与练】第4课:条件判断 if / else
开发语言·学习·rust
m0_3807438742 分钟前
给 Claude API 调用补上超时重试和错误分类
开发语言·人工智能·php
天远数科42 分钟前
风险治理实战:基于天远车信盟出险构建自动化理赔核保流水线
java·网络·人工智能·自动化
Draw Stars1 小时前
Git BASH安装教程
开发语言·git·bash