示例#1
0
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()