def hill_climber(data, prep_schedule, slot_list, course_list):

    """ Climbs the hill stops when he is stuck

    """
    schedule = random_schedule(prep_schedule, slot_list)
    old_fitness, old_capacity_minus, old_student_minus, old_sequence_minus = fitness_function.main(schedule, course_list)
    new_fitness = 0
    # one step
    while True:
        tries = 0
        # one trie
        while True:
            tries += 1
            session_1 = random.choice(schedule)
            session_2 = random.choice(schedule)
            switch(session_1, session_2)
            new_fitness, new_capacity_minus, new_student_minus, new_sequence_minus = fitness_function.main(schedule, course_list)
            if new_fitness > old_fitness:
                break
            else:
                switch(session_1, session_2)
            if tries > 500:
                return False
        old_fitness = new_fitness
        old_capacity_minus = new_capacity_minus
        old_student_minus = new_student_minus
        old_sequence_minus = new_sequence_minus
        print "Total Fitness: " + str(old_fitness)
        print "Capacity Conflict: " + str(old_capacity_minus)
        print "Student Conflict: " + str(old_student_minus)
        print "Sequence Conflict" + str(old_sequence_minus)
        if old_student_minus == 0 and  old_capacity_minus == 0 and old_sequence_minus == 0:
            table_data = prep_table(schedule)
            return table_data, old_capacity_minus, old_student_minus, old_sequence_minus
Esempio n. 2
0
def main():
    #generate initial population:
    ranges = fitness_function.get_ranges()
    pop_init = np.zeros(
        (ga_params["n_pop"],
         len(ranges)))  #matrix of ones with n_pop lines and n_var columns
    for i in range(len(ranges)):
        var_min = ranges[i][1][0]
        var_max = ranges[i][1][1]
        column_i = np.random.rand(ga_params["n_pop"], 1)
        if isinstance(var_min, float) or isinstance(var_max, float):
            column_i = column_i * (var_max - var_min) + var_min
        else:
            column_i = int(round((column_i * (var_max - var_min)))) + var_min

        pop_init[:, i] = column_i[:, 0]

    #calculate fitness values for initial population:
    fitness_init = fitness_function.main(pop_init[:, 0], pop_init[:, 1])
    pop = np.append(pop_init, fitness_init, axis=1)
    evolution = pop[np.argmin(pop[:, -1]), :].reshape(1, pop.shape[1])

    #np.array([np.min(), np.mean(pop[:,-1])])

    #generations cicle:
    for gen in range(1, ga_params["n_gen"]):
        #choose elements to keep for next generation (selection):
        parents = selection(pop)

        #pair the parents for mating (pairing):
        paired_parents = pairing(parents)

        #parents mating to generate new elements to complete next generation's population:
        offsprings = mating(paired_parents)
        offspring_results = fitness_function.main(offsprings[:, 0],
                                                  offsprings[:, 1])
        offsprings = np.append(offsprings, offspring_results, axis=1)

        #consolidate population (parents and offsprings):
        new_pop = np.append(parents, offsprings, axis=0)

        #introduce random mutation on the population:
        pop = mutation(new_pop, ranges)

        #determine best and average of population and save it:
        evolution = np.append(evolution,
                              pop[np.argmin(pop[:, -1]), :].reshape(
                                  1, pop.shape[1]),
                              axis=0)

    #Print results:
    print("Algorithm completed")
    print(evolution[-1, :])
    return (evolution)
Esempio n. 3
0
def mutation(pop, ranges):
    n_elems = pop.shape[0]  # number of elements in the population
    n_vars = pop.shape[1] - 1  # number of variables
    n_mutations = round(
        n_elems * n_vars *
        ga_params["mut_rate"])  #number of mutations to be performed
    index_best = np.argmin(
        pop[:, -1])  # index of the best element in the population

    # for each mutation:
    for mut in range(n_mutations):
        elem = round(np.random.rand() * n_elems - 1)
        var = round(np.random.rand() * n_vars - 1)

        #elitism:
        if ga_params["elitism"] and elem == index_best:
            continue

        value = pop[elem, var]
        if isinstance(value, float):
            pop[elem, var] = (ranges[var][1][1] - ranges[var][1][0]
                              ) * np.random.rand() + ranges[var][1][0]
        else:
            pop[elem, var] = int(
                round((ranges[var][1][1] - ranges[var][1][0]) *
                      np.random.rand() + ranges[var][1][0]))

        # calculate new fitness based on mutated values:
        pop[elem, -1] = fitness_function.main(pop[elem, 0], pop[elem, 1])

    return (pop)
Esempio n. 4
0
def hill_climber(data, prep_schedule, slot_list, course_list):
    """ Climbs the hill stops when he is stuck

    """
    schedule = random_schedule(prep_schedule, slot_list)
    old_fitness, old_capacity_minus, old_student_minus, old_sequence_minus = fitness_function.main(
        schedule, course_list)
    new_fitness = 0
    # one step
    while True:
        tries = 0
        # one trie
        while True:
            tries += 1
            session_1 = random.choice(schedule)
            session_2 = random.choice(schedule)
            switch(session_1, session_2)
            new_fitness, new_capacity_minus, new_student_minus, new_sequence_minus = fitness_function.main(
                schedule, course_list)
            if new_fitness > old_fitness:
                break
            else:
                switch(session_1, session_2)
            if tries > 500:
                return False
        old_fitness = new_fitness
        old_capacity_minus = new_capacity_minus
        old_student_minus = new_student_minus
        old_sequence_minus = new_sequence_minus
        print "Total Fitness: " + str(old_fitness)
        print "Capacity Conflict: " + str(old_capacity_minus)
        print "Student Conflict: " + str(old_student_minus)
        print "Sequence Conflict" + str(old_sequence_minus)
        if old_student_minus == 0 and old_capacity_minus == 0 and old_sequence_minus == 0:
            table_data = prep_table(schedule)
            return table_data, old_capacity_minus, old_student_minus, old_sequence_minus
    rand_schedule = random_schedule(prep_schedule, slot_list)
    old_generation.append(rand_schedule)

generation = 0

fitness_total = []

# print results of algo
for i in range(number_generations):
    new_generation = next_generation(old_generation, slot_list)
    old_generation = new_generation
    fitness_list = []
    capacity_list = []
    student_list = []
    for schedule in old_generation:
        fitness, capacity_minus, student_minus = fitness_function.main(schedule)
        fitness_list.append(fitness)
        fitness_total.append(fitness)
        capacity_list.append(capacity_minus)
        student_list.append(student_minus)
    print "Generation number: " + str(generation)
    print "Av Fitness: " + str(sum(fitness_list) / len(fitness_list))
    print "Av Capacity: " + str(sum(capacity_list) / len(capacity_list))
    print "Av Student: " + str(sum(student_list) / len(student_list))
    print "Best Fitness: " + str(max(fitness_list))
    print "Best Capacity: " + str(min(capacity_list))
    print "Best Student: " + str(min(student_list))
    print "Worst Fitness: " + str(min(fitness_list))
    print "Worst Capacity: " + str(max(capacity_list))
    print "Worst Student: " + str(max(student_list))
    print ""
    rand_schedule = random_schedule(prep_schedule, slot_list)
    old_generation.append(rand_schedule)

generation = 0

fitness_total = []

# print results of algo
for i in range(number_generations):
    new_generation = next_generation(old_generation, slot_list)
    old_generation = new_generation
    fitness_list = []
    capacity_list = []
    student_list = []
    for schedule in old_generation:
        fitness, capacity_minus, student_minus = fitness_function.main(
            schedule)
        fitness_list.append(fitness)
        fitness_total.append(fitness)
        capacity_list.append(capacity_minus)
        student_list.append(student_minus)
    print "Generation number: " + str(generation)
    print "Av Fitness: " + str(sum(fitness_list) / len(fitness_list))
    print "Av Capacity: " + str(sum(capacity_list) / len(capacity_list))
    print "Av Student: " + str(sum(student_list) / len(student_list))
    print "Best Fitness: " + str(max(fitness_list))
    print "Best Capacity: " + str(min(capacity_list))
    print "Best Student: " + str(min(student_list))
    print "Worst Fitness: " + str(min(fitness_list))
    print "Worst Capacity: " + str(max(capacity_list))
    print "Worst Student: " + str(max(student_list))
    print ""