在 Ortools 中使用 CP-SAT 进行无重叠调度

问题描述 投票:0回答:1

任何人都可以帮助我如何防止日程安排重叠,日程安排在房间分配方面不得重叠

def schedule_variable(self):
    for program in self.programs:
        for course in self.curriculum[program]:
            # Determine the number of intervals (consecutive hours/time slots) based on course type
            if self.course_type[course].lower() == 'laboratory':
                schedule1_num_of_interval = 3
                schedule2_num_of_interval = 2
            else:
                schedule1_num_of_interval = 2
                schedule2_num_of_interval = 1
            
            # Define scheduling variables
            schedule1_room = self.model.NewIntVar(0, len(self.rooms) - 1, f'room_{program}_{course}')
            schedule2_room = self.model.NewIntVar(0, len(self.rooms) - 1, f'room_{program}_{course}')
            
            schedule1_day = self.model.NewIntVar(0, len(self.days) - 1, f'day_{program}_{course}')
            schedule_for_interval_day = self.model.NewIntVar(0, len(self.days) - 1, f'day_{program}_{course}')
            schedule2_day = self.model.NewIntervalVar(schedule1_day, 3, schedule_for_interval_day, f'schedule2_{program}_{course}')
            
            schedule_time_start = self.model.NewIntVar(0, len(self.times) - 1, f'start_{program}_{course}')
            schedule_time_end = self.model.NewIntVar(0, len(self.times) - 1, f'end_{program}_{course}')
            schedule2_time_start = self.model.NewIntVar(0, len(self.times) - 1, f'start_{program}_{course}')
            schedule2_time_end = self.model.NewIntVar(0, len(self.times) - 1, f'end_{program}_{course}')
            schedule1_time = self.model.NewIntervalVar(schedule_time_start, schedule1_num_of_interval, schedule_time_end, f'schedule1_{program}_{course}')
            schedule2_time = self.model.NewIntervalVar(schedule2_time_start, schedule2_num_of_interval, schedule2_time_end, f'schedule2_{program}_{course}')
            
            instructor = self.model.NewIntVar(0, len(self.instructor) - 1, f'end_{program}_{course}')
            
            # Update the schedules dictionary
            self.schedules[program, course] = {
                'instructor': instructor,
                'schedule1': {
                    'room': schedule1_room,
                    'day': schedule1_day,
                    'time': schedule1_time,
                },
                'schedule2': {
                    'room': schedule2_room,
                    'day': schedule2_day,
                    'time': schedule2_time,
                }
            }

我尝试过,但它只限制时间

def no_overlap_constraints(self):
    for (program, course1), details1 in self.schedules.items():
        for (program, course2), details2 in self.schedules.items():
            if (program, course1) != (program, course2):
                # Constraint for Schedule 1
                self.model.AddNoOverlap([details1['schedule1']['time'], details2['schedule1']['time']])
                self.model.AddNoOverlap([details1['schedule2']['time'], details2['schedule2']['time']])

这是输出

C:\Users\Admin\project\last>python main.py (0, 0): 导师:0 时间表 1 - 房间:0,日期:0,时间:3-6 时间表 2 - 房间:1,天数:3,时间:0-2 (0, 1): 导师:0 时间表 1 - 房间:1,日期:0,时间:6-8 时间表 2 - 房间:1,天数:3,时间:5-6 (1, 2): 导师:1名 时间表 1 - 房间:0,日期:0,时间:0-3 时间表 2 - 房间:1,天数:3,时间:2-4 (1, 3): 导师:1名 时间表 1 - 房间:1,日期:0,时间:8-10 时间表 2 - 房间:1,天数:3,时间:4-5 (2, 0): 导师:0 时间表 1 - 房间:0,日期:0,时间:3-6 时间表 2 - 房间:1,天数:3,时间:0-2 (2, 1): 导师:0 时间表 1 - 房间:1,日期:0,时间:6-8 时间表 2 - 房间:1,天数:3,时间:5-6 (3, 2): 导师:1名 时间表 1 - 房间:0,日期:0,时间:0-3 时间表 2 - 房间:1,天数:3,时间:2-4 (3, 3): 导师:1名 时间表 1 - 房间:1,日期:0,时间:8-10 时间表 2 - 房间:1,天数:3,时间:4-5

python algorithm or-tools cp-sat constraint-satisfaction
1个回答
0
投票

每个资源(教师、房间、学生组)需要 1 个重叠。

然后收集每个资源的所有间隔,并将所有间隔添加到同一资源/no_overlap。

在这个灵活的作业车间示例中了解这是如何完成的

© www.soinside.com 2019 - 2024. All rights reserved.