-
Notifications
You must be signed in to change notification settings - Fork 2
/
EvolutionaryFramework.py
126 lines (111 loc) · 4.91 KB
/
EvolutionaryFramework.py
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
from multiprocessing import Process, Manager, Queue
import collections
import numpy as np
def _new_fitness(input_queue, output_queue, fitness):
while True:
new_item = input_queue.get()
output_queue.put((new_item, fitness(new_item)))
class FitnessProcess:
def __init__(self, process_limited):
self.pool = list()
self.process_limited = process_limited
self.input_queue = Queue()
self.output_queue = Queue()
self.current_task = 0
def setup_fitness(self, fitness):
for i in xrange(self.process_limited):
self.pool.append(Process(target=_new_fitness, args=(self.input_queue, self.output_queue, fitness)))
for single_process in self.pool:
single_process.start()
def send_item(self, target_item):
self.current_task += 1
self.input_queue.put(target_item)
def close(self):
for i in xrange(self.process_limited):
self.pool[i].terminate()
def __iter__(self):
return self
def next(self):
if self.current_task == 0:
raise StopIteration()
self.current_task -= 1
return self.output_queue.get()
def evolutionary_framework(generation, population, generator, sorter,
fitness, acceptable, selector, mutation, crossover, process_limited):
process_pool = FitnessProcess(process_limited)
process_pool.setup_fitness(fitness)
population_lst = generator(population)
for single_item in population_lst:
process_pool.send_item(single_item)
population_lst = list()
for single_item in process_pool:
population_lst.append(single_item)
population_lst = sorter(population_lst)
# population_lst.reverse()
print "finished."
for i in range(generation):
print "In " + str(i) + " generation:"
print population_lst
child_lst = list()
for single_item in population_lst:
if selector(single_item, population_lst):
if mutation is not None:
result_item = mutation(single_item)
if isinstance(result_item, collections.Iterable):
child_lst += result_item
else:
child_lst.append(result_item)
if crossover is not None:
child_lst.append(crossover(single_item, population_lst))
for single_item in child_lst:
process_pool.send_item(single_item)
child_lst = list()
for single_item in process_pool:
child_lst.append(single_item)
population_lst += child_lst
# population_lst = generator(population)
# for single_item in population_lst:
# process_pool.send_item(single_item)
# population_lst = list()
# for single_item in process_pool:
# population_lst.append(single_item)
population_lst = sorter(population_lst)
# population_lst.reverse()
# if population_lst[0][1] == population_lst[-1][1]:
# np.random.shuffle(population_lst)
population_lst = population_lst[: population]
if acceptable is not None and acceptable(population_lst):
process_pool.close()
print "Acceptable early in generation " + str(i) + ": "
print population_lst
return population_lst, i
process_pool.close()
return population_lst, generation
def evolutionary_framework_local(generation, population, generator, sorter, fitness,
acceptable, selector, mutation, crossover):
population_lst = generator(population)
population_lst = [(item, fitness(item)) for item in population_lst]
population_lst = sorter(population_lst)
for i in range(generation):
child_lst = list()
for single_item in population_lst:
if selector(single_item, population_lst):
if mutation is not None:
result_item = mutation(single_item)
if isinstance(result_item, collections.Iterable):
child_lst += result_item
else:
child_lst.append(result_item)
if crossover is not None:
child_lst.append(crossover(single_item, population_lst))
child_lst = [(item, fitness(item)) for item in child_lst]
population_lst += child_lst
population_lst = sorter(population_lst)
# if population_lst[0][1] == population_lst[-1][1]:
# np.random.shuffle(population_lst)
population_lst = population_lst[: population]
print "In " + str(i) + " generation: "
print population_lst
if acceptable is not None and acceptable(population_lst):
return population_lst, i
return population_lst, generation