java排课算法简单demo

简化的场景设定

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

Java代码实现

首先,我们定义几个基本的类:Course、Teacher、Room 和 TimeSlot。

复制代码
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()方法打印出排课结果。

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

相关推荐
荣码6 分钟前
从0到1搭一个生产级RAG系统:串联前面21篇所有知识
java·python
xuxigifxfh9 分钟前
牛客:HJ170 01序列
java·开发语言·算法·华为机考
朝朝辞暮i19 分钟前
C++ 第 33 课:事件循环——spin() 到底在干什么
开发语言·c++·算法
野生技术架构师30 分钟前
牛客网互联网大厂 Java 高频面试题整理(持续更新)
java·开发语言
殷色玫瑰31 分钟前
AVL树:从平衡因子到四种旋转的完整实现
c语言·数据结构·c++·算法·visualstudio
小师兄吃牛肉1 小时前
Java语法 | 多重循环
java·开发语言·python
Han.miracle1 小时前
MySQL InnoDB:MVCC、记录锁、间隙锁、二级索引MVCC底层原理
java·开发语言
.YM.Z1 小时前
C++——【红黑树】原理详解:定义、性质、插入变色与旋转实现
开发语言·c++
jidaowansui1 小时前
B3643 图的存储———>数组模拟邻接矩阵
算法
不停喝水2 小时前
【前端转全栈java速通课】 项目实战④7-11节 操作数据库-登录-注册-修改密码-注销-mubatis-plus简化crud-
java·前端·数据库