You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OR-Tools排班求解器结果不显示问题求助

问题排查与修复方案

我帮你找到了问题的核心:嵌套在sup_functions()里的main()函数根本没有被执行!

为什么会这样?

你单独运行OR-Tools示例时,main()函数里的if __name__ == '__main__':判断会触发——因为此时脚本是作为主程序运行的,__name__的值就是__main__,所以求解逻辑正常执行。但当你把这段代码整合到交互控制逻辑后,main()被定义在sup_functions()函数内部,当sup_functions()被调用时,那个if __name__ == '__main__':的条件不会生效(这个判断原本是为了脚本单独运行时触发,现在main()是嵌套函数,不会自动执行),导致求解代码完全没跑起来,自然看不到结果。

修复方法

只需要把main()内部的if __name__ == '__main__':去掉,直接在sup_task == 'schedule employees'的分支末尾调用main()即可。

完整修改后的代码

from ortools.sat.python import cp_model
def sup_functions():
    # 管理员功能
    sup_task = input('I want to: ')
    # 员工排班
    if sup_task == 'schedule employees':
        class EmpsPartialSolutionPrinter(cp_model.CpSolverSolutionCallback):
            def __init__(self, shifts, num_emps, num_days, num_shifts, sols):
                cp_model.CpSolverSolutionCallback.__init__(self)
                self._shifts = shifts
                self._num_emps = num_emps
                self._num_days = num_days
                self._num_shifts = num_shifts
                self._solutions = set(sols)
                self._solution_count = 1

            def on_solution_callback(self):
                if self._solution_count in self._solutions:
                    print('Solution %i' % self._solution_count)
                    for d in range(self._num_days):
                        print('Day %i' % d)
                        for n in range(self._num_emps):
                            is_working = False
                            for s in range(self._num_shifts):
                                if self.Value(self._shifts[(n, d, s)]):
                                    is_working = True
                                    print(' Employee %i works shift %i' % (n, s))
                            if not is_working:
                                print(' Employee {} does not work'.format(n))
                        print()
                    self._solution_count += 1

            def solution_count(self):
                return self._solution_count

        def main():
            # 数据输入
            num_emps = int(input("How many employees are you scheduling? "))
            num_days = int(input("How many days are you scheduling for? "))
            num_shifts = int(input(f"How many shifts are you scheduling for each employees for {num_days} days? "))

            all_emps = range(num_emps)
            all_shifts = range(num_shifts)
            all_days = range(num_days)

            # 创建模型
            model = cp_model.CpModel()

            # 创建班次变量
            # shifts[(n, d, s)]: 员工n在d天的s班次工作
            shifts = {}
            for n in all_emps:
                for d in all_days:
                    for s in all_shifts:
                        shifts[(n, d, s)] = model.NewBoolVar('shift_n%id%is%i' % (n, d, s))

            # 每个班次在排班周期内仅分配给一名员工
            for d in all_days:
                for s in all_shifts:
                    model.Add(sum(shifts[(n, d, s)] for n in all_emps) == 1)

            # 每位员工每天最多工作一个班次
            for n in all_emps:
                for d in all_days:
                    model.Add(sum(shifts[(n, d, s)] for s in all_shifts) <= 1)

            # 尝试均匀分配班次,每位员工至少工作min_shifts_per_emp个班次
            # 若总班次无法被员工数整除,部分员工多一个班次
            min_shifts_per_emp = (num_shifts * num_days) // num_emps
            if num_shifts * num_days % num_emps == 0:
                max_shifts_per_emp = min_shifts_per_emp
            else:
                max_shifts_per_emp = min_shifts_per_emp + 1

            for n in all_emps:
                num_shifts_worked = 0
                for d in all_days:
                    for s in all_shifts:
                        num_shifts_worked += shifts[(n, d, s)]
                model.Add(min_shifts_per_emp <= num_shifts_worked)
                model.Add(num_shifts_worked <= max_shifts_per_emp)

            # 创建求解器并求解
            solver = cp_model.CpSolver()
            solver.parameters.linearization_level = 0
            # 展示前5个解
            a_few_solutions = range(5)
            solution_printer = EmpsPartialSolutionPrinter(shifts, num_emps, num_days, num_shifts, a_few_solutions)
            solver.SearchForAllSolutions(model, solution_printer)

        # 关键修改:直接调用main()执行求解逻辑
        main()

# 指定调用的函数
def emporsup():
    emp_or_sup = input('Are you an employee or supervisor? ')
    # 判断用户身份是员工还是管理员
    if emp_or_sup == "supervisor":
        sup_functions()
    #elif emp_or_sup == "employee":
    #    emp_functions()
    else:
        print("not a valid response")

emporsup()

这样修改后,当你输入supervisor再输入schedule employees,程序就会正常获取用户输入、执行求解逻辑并输出结果了。

内容的提问来源于stack exchange,提问作者user14702942

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:07:30