def local_search(doctors, tasks, iterations): su.update_objective_function(doctors, tasks) for i in range(iterations): move = random.choice([ mo.schedule_task_random, mo.remove_task_random, mo.swap_task_random, mo.swap_between_oncall, mo.swap_morning_oncall, mo.swap_afternoon_oncall, mo.swap_weekend_oncall ]) original_doctors, original_tasks, good_move = move(doctors, tasks) for t in original_tasks: tasks[t].update_all_penalties(doctors) for d in original_doctors: doctors[d].update_all_penalties(tasks) if 'POK' in original_tasks: good_move = mo.repair_POK(doctors, tasks, original_doctors, original_tasks) old_cost = sum([d.all_penalties for d in original_doctors.values()]) \ + sum([t.all_penalties for t in original_tasks.values()]) new_cost = sum([doctors[d].all_penalties for d in original_doctors]) \ + sum([tasks[t].all_penalties for t in original_tasks]) if new_cost <= old_cost and good_move: pass else: for t in original_tasks: tasks[t] = original_tasks[t] for d in original_doctors: doctors[d] = original_doctors[d] return doctors
def main(): PH = 84 # planning horizon mo.PH = PH su.PH = PH cc.PH = PH tasks = su.create_tasks() doctors = su.create_doctors(tasks) su.construct_feasible_solution(doctors, tasks) best_solution = copy.deepcopy(doctors) start_time = time.time() last = su.update_objective_function(doctors, tasks) solution_number = 0 while True: i = 0 tasks = su.create_tasks() doctors = su.create_doctors(tasks) su.construct_feasible_solution(doctors, tasks) su.update_objective_function(doctors, tasks) for i in range(30000): move = random.choice([ mo.schedule_task_random, mo.remove_task_random, mo.swap_task_random, mo.swap_between_oncall, mo.swap_morning_oncall, mo.swap_afternoon_oncall, mo.swap_weekend_oncall ]) original_doctors, original_tasks, good_move = move(doctors, tasks) for t in original_tasks: tasks[t].update_all_penalties(doctors) for d in original_doctors: doctors[d].update_all_penalties(tasks) if 'POK' in original_tasks: good_move = mo.repair_POK(doctors, tasks, original_doctors, original_tasks) old_cost = sum([d.all_penalties for d in original_doctors.values()]) \ + sum([t.all_penalties for t in original_tasks.values()]) new_cost = sum([doctors[d].all_penalties for d in original_doctors]) \ + sum([tasks[t].all_penalties for t in original_tasks]) diff = abs(su.return_objective_function(doctors, tasks)-su.update_objective_function(doctors,tasks)) if diff > 0.5: print diff print move.__name__ assert False if new_cost <= old_cost and good_move: pass else: for t in original_tasks: tasks[t] = original_tasks[t] for d in original_doctors: doctors[d] = original_doctors[d] diff = abs(su.return_objective_function(doctors, tasks)-su.update_objective_function(doctors,tasks)) if diff > 0.5: print diff print move.__name__ assert False
def main(): PHweeks = 12 PH = 21 * PHweeks # planning horizon mo.PH = PH su.PH = PH cc.PH = PH changes = [] tasks = su.create_tasks() doctors = su.create_doctors(tasks) su.construct_feasible_solution(doctors, tasks) print 'Initial Solution cost: ', su.update_objective_function(doctors, tasks) iterations = 215000 temp = 300 cool = 0.93 costs = [su.return_objective_function(doctors, tasks)] start_time = time.time() for i in range(1, iterations): if i%(iterations/100)==0: print '{}%'.format(int((i/iterations)*100)) temp *= cool costs.append(su.return_objective_function(doctors, tasks)) move = su.weighted_choice([ mo.schedule_task_random, mo.remove_task_random, mo.swap_task_random, mo.swap_between_oncall, mo.swap_morning_oncall, mo.swap_afternoon_oncall, mo.swap_weekend_oncall ], [1,0.75,1,1,1,1,1]) original_doctors, original_tasks, good_move = move(doctors, tasks) for t in original_tasks: tasks[t].update_all_penalties(doctors) for d in original_doctors: doctors[d].update_all_penalties(tasks) if 'POK' in original_tasks: good_move = mo.repair_POK(doctors, tasks, original_doctors, original_tasks) old_cost = sum([d.all_penalties for d in original_doctors.values()]) \ + sum([t.all_penalties for t in original_tasks.values()]) new_cost = sum([doctors[d].all_penalties for d in original_doctors]) \ + sum([tasks[t].all_penalties for t in original_tasks]) if (new_cost <= old_cost and good_move): pass elif math.exp(-(new_cost - old_cost) / temp) >= random.random() and good_move: pass else: for t in original_tasks: tasks[t] = original_tasks[t] for d in original_doctors: doctors[d] = original_doctors[d] end_time = time.time() costs.append(su.return_objective_function(doctors, tasks)) print 'Best objective function: ', su.return_objective_function(doctors,tasks) time_taken = abs(start_time - end_time) print 'Time taken: ', time_taken print 'time per iteration: ', time_taken/iterations su.write_solution(doctors, tasks, 'SAsol')