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
相关产品推荐
相关产品推荐

