def solution(toy_file, soln_file, num_elves, TARGET):
    """ Creates a simple solution where the next available elf is assigned a toy. Elves do not start
    work outside of sanctioned hours.
    :param toy_file: filename for toys file (input)
    :param soln_file: filename for solution file (output)
    :param myelves: list of elves in a priority queue ordered by next available time
    :return:
    """
    hrs = Hours()

    toy_loader = ToyLoader(toy_file)
    solution_writer = SolutionWriter(soln_file)
    busy_elves_heap = BusyElvesHeap(num_elves)

    elves_ready = ElvesReady()
    scheduler = Scheduler(TARGET, num_elves)

    start = time.time()

    current_time = 497340

    print("Getting initial toys")
    print('time taken = {0}, current_time = {1}'.format(time.time() - start, hrs.get_time_string(current_time)))
    new_toy_orders = toy_loader.get_toys_up_to_minute(current_time)

    print("Loading initial toys into backlog")
    print('time taken = {0}, current_time = {1}'.format(time.time() - start, hrs.get_time_string(current_time)))
    toy_backlog = ToyBacklogV2(new_toy_orders)

    print("Finished initializing toys into backlog")
    print('time taken = {0}, current_time = {1}'.format(time.time() - start, hrs.get_time_string(current_time)))

    toys_finished = 0

    toys_left_at_end = []

    time_of_last_toy_assigned = current_time

    while not (toy_loader.done() and toy_backlog.done() and len(toys_left_at_end) == 0):

        # step 1 process newly arrived toys and fresh elves
        new_elves = busy_elves_heap.get_elves_for_min(current_time)

        elves_ready.add_elves(new_elves)

        if (current_time % 120 == 60):
            print('time taken = {0}, current_time = {1}'.format(time.time() - start, hrs.get_time_string(current_time)))
            print('easy_toys:{0},\t constant_toys:{1},\t variable_toys:{2},\t hardest_toys:{3},\t toys_left_at_end:{4}'.format(
                toy_backlog.easy_toy_list.size, len(toy_backlog.constant_rating_list),
                len(toy_backlog.variable_toy_list), len(toy_backlog.hardest_toy_list), len(toys_left_at_end)))
            print('elves ready:{0}, high-perf-elves:{1}'.format(len(elves_ready.training_elf_list),
                                                                len(elves_ready.high_performance_elf_list)))
            print('toys finished = {0}'.format(toys_finished))

        if (len(elves_ready.training_elf_list) + len(elves_ready.high_performance_elf_list)) == 0:
            current_time = hrs.next_sanctioned_minute(current_time)
            continue

        if (toy_loader.done() and current_time - time_of_last_toy_assigned > 2880 and len(elves_ready.training_elf_list) == num_elves and len(toys_left_at_end) == 0):
            print("starting cleanup")
            for toy in toy_backlog.easy_toy_list.all_toys():
                toys_left_at_end.append(toy)
            toy_backlog.easy_toy_list.clear()
            for toy in toy_backlog.constant_rating_list:
                toys_left_at_end.append(toy)
            toy_backlog.constant_rating_list = []
            while len(toy_backlog.variable_toy_list) > 0:
                toys_left_at_end.append(toy_backlog.pop_variable_toy())
            while len(toy_backlog.hardest_toy_list) > 0:
                toys_left_at_end.append(toy_backlog.pop_hardest_toy())

        if (toy_loader.done() and len(toys_left_at_end) > 0):
            # clean up last toys
            toys_finished += scheduler.clean_up(toys_left_at_end, elves_ready, busy_elves_heap, current_time, solution_writer)

        else:
            # step 2 pair off as many elves and toys as possible
            toys_newly_finished = scheduler.schedule(toy_backlog, elves_ready, busy_elves_heap, current_time,
                                                solution_writer, toy_loader)
            toys_finished += toys_newly_finished
            if (toys_newly_finished > 0):
                time_of_last_toy_assigned = current_time

        current_time = hrs.next_sanctioned_minute(current_time)

    toy_loader.close()
    solution_writer.close()
예제 #2
0
        #   Sinon planifier l'objet pour le lendemain matin et le traiter et remplir le reste de la journée avec des objets "courts"
        if c % 10000 == 0:
            print("TOYPOOL WAITING LEN : %d, TOYPOOL AVAILABLE LEN : %d, ELFPOOL LEN : %d" % (mytoypool.length_waiting_list(), mytoypool.length_available_list(), len(myelfpool)))

        # Etape 1 : Prendre le prochain elfe disponible
        elf = myelfpool.next_available_elf()

        # Etape 1 Bis : Mettre à jour le toy pool par rapport à la date de disponibilité de l'elfe
        # Avancer jusqu'à ce qu'il y ait des jouets dans l'available list
        while True:
            mytoypool.update_available_toy_list_according_to_elf(elf)
            if mytoypool.length_available_list() > 0:
                break
            else:
                t = elf.get_next_available_time()
                next_t = hrs.next_sanctioned_minute(t)
                elf.set_next_available_time(next_t)


        # Etape 2 : Recupérer la productivité de l'elfe
        productivity = elf.get_productivity()
        
        # Etape 2, Cas 1 : La productivité est supérieure au seuil
        if productivity > PRODUCTIVITY_THRESHOLD:
            # Etape 3 : Récupérer le jouet le plus gros disponible
            toy = mytoypool.get_next_longest_toy_for_elf(elf)

            if toy is not None:
                # Etape 4 : Faire le jouet
                elf.make_toy(toy, wcsv)
            else: