-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1-max.py
More file actions
71 lines (56 loc) · 2.36 KB
/
1-max.py
File metadata and controls
71 lines (56 loc) · 2.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
"""
1-max Code for MetaHeuristics
"""
import random
import copy
def calculate_fitness(individual):
return sum(individual)
def sort_by_fitness(population):
fp = []
for individual in population:
fitness = calculate_fitness(individual)
fp.append((fitness, individual))
fp.sort(reverse=True)
sorted_population = []
for fitness, individual in fp:
sorted_population.append(individual)
return sorted_population
def selection(population, population_size, selection_rate):
sorted_population = sort_by_fitness(population)
n = int(population_size * selection_rate)
return sorted_population[0 : n]
def crossover(ind1, ind2, chromosomes_size):
r1 = random.randint(0, chromosomes_size -1)
r2 = random.randint(r1 + 1, chromosomes_size)
ind = copy.deepcopy(ind1)
ind[r1:r2] = ind2[r1:r2]
return ind
def mutation(ind1, chromosome_size, mutation_rate):
ind2 = copy.deepcopy(ind1)
for i in range(chromosome_size):
if random.random() < mutation_rate:
ind2[i] = random.randint(0,1)
return ind2
def main(population_size, chromosomes_size, iterations, mutation_rate=0.2, selection_rate = 0.5):
population = []
for i in range(population_size):
individual = []
for j in range(chromosomes_size):
individual.append(random.randint(0,1))
population.append(individual)
for generation in range(iterations):
population = selection(population, population_size, selection_rate)
n = population_size - len(population)
for i in range(n):
parent1_index = random.randint(0, len(population) -1)
parent2_index = random.randint(0, len(population) -1)
individual = crossover(population[parent1_index], population[parent2_index], chromosomes_size)
individual = mutation(individual, chromosomes_size, mutation_rate)
population.append(individual)
# if calculate_fitness(population[0]) is chromosomes_size:
# print("Best Found at "+ str(generation) + " Fitness: " + str(chromosomes_size))
# break;
for individual in population:
print("Individual: ", individual,"Fitness: ", calculate_fitness(individual))
if __name__ == "__main__":
main(population_size=10, chromosomes_size=10, iterations=1000, mutation_rate=0.2, selection_rate=0.5)