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')
+ 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 local_search_lambda(doctors): tasks = su.create_tasks() return local_search(doctors, tasks, 100000) if __name__ == '__main__': p = mp.Pool() tasks = su.create_tasks() best_solutions = [i for row in p.map(RLS, [1, 2, 3,4]) for i in row] print 'Number of schedules: ', len(best_solutions) best_solutions = sorted(best_solutions, key = lambda x: su.update_objective_function(x, tasks))[0:2] best_solutions = p.map(local_search_lambda, best_solutions) best = min(best_solutions, key=lambda x: su.update_objective_function(x, tasks)) su.update_objective_function(best, tasks) su.write_solution(best, tasks, 'best_sol') print 'time: ', start_time - time.time()