Skip to content

img.png

Генетические алгоритмы

Что такое генетический алгоритм?

Генетические алгоритмы — это тип алгоритма оптимизации и поиска, вдохновленный процессом естественного отбора в биологической эволюции.

Эти алгоритмы используют такие принципы, как мутация, скрещивание (или воспроизводство) и отбор для поиска решений сложных проблем.

img_1.png

Джон Генри Холланд – американский ученый, профессор электротехники и информатики в Мичиганском университете. Наиболее известен как инноватор сложных адаптивных систем и нелинейной науки, а также создатель генетических алгоритмов.

Идею генетических алгоритмов он сформулировал и обосновал в конце 60-х-начале 70-х гг. ХХ в. Он заинтересовался свойствами процессов естественной эволюции, в том числе фактом, что эволюционируют хромосомы, а не сами существа. Ученый был уверен в возможности составить и реализовать в виде компьютерной программы алгоритм, который будет решать сложные задачи так, как это делает природа – путем эволюции. Поэтому он начал трудиться над алгоритмами, оперировавшими последовательностями двоичных цифр (единиц и нулей), получившими название хромосом.

Генетические алгоритмы работают по аналогии с природой. Они оперируют с совокупностью «особей», представляющих собой строки, каждая из которых кодирует одно из решений задачи. Приспособленность особи оценивается с помощью специальной функции. Наиболее приспособленные получают шанс скрещиваться и давать потомство. Наихудшие особи удаляются. Таким образом, приспособленность нового поколения в среднем выше предыдущего. На практике генетические алгоритмы используются для решения таких, задач, как оптимизация запросов в базах данных, настройка и обучение искусственной нейронной сети, составление игровых стратегий, создание искусственной жизни. Вышедшая в 1975 г. книга Джона Холланда «Адаптация в естественных и искусственных системах» [Adaptation in Natural and Artificial Systems] является основополагающим трудом в этой области исследований

Population

Это относится к набору возможных решений (или хромосом) проблемы. На каждой итерации (или поколении) генетические алгоритмы работают с популяцией хромосом.

Fitness Function

Эта функция измеряет качество или «пригодность» решения для популяции, направляя поиск оптимальных решений.

Operators: Selection, Crossover, Mutation

Эти операторы имитируют естественные эволюционные процессы. Отбор выбирает подходящих особей, скрещивание объединяет два решения для создания новых, а мутация вносит в решение небольшие случайные изменения.

python
import random

# Количество особей в каждом поколении
POPULATION_SIZE = 100

# Валидные гены
GENES = '''abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP
QRSTUVWXYZ 1234567890, .-;:_!"#%&/()=?@${[]}'''

# Целевая строка для генерации
TARGET = "In principio erat Verbum 2000"

class Individual(object):
	'''
	Класс, представляющий отдельную особь (индивида) в популяции
	'''
	def __init__(self, chromosome):
		self.chromosome = chromosome
		self.fitness = self.cal_fitness()

	@classmethod
	def mutated_genes(self):
		'''
		Создаем случайные гены для мутации
		'''
		global GENES
		gene = random.choice(GENES)
		return gene

	@classmethod
	def create_gnome(self):
		'''
		Создаем хромосому или набор генов
		'''
		global TARGET
		gnome_len = len(TARGET)
		return [self.mutated_genes() for _ in range(gnome_len)]

	def gene_transfer(self, par2):
		'''
		Передаем гены новому поколению индивидов
		'''

		child_chromosome = []
		for gp1, gp2 in zip(self.chromosome, par2.chromosome):

			prob = random.random()

			# если вероятность меньше 0,45, берем ген
			# от родителя 1
			if prob < 0.45:
				child_chromosome.append(gp1)

			# если вероятность между 0.45 и 0.90, берем
			# ген от родителя 2
			elif prob < 0.90:
				child_chromosome.append(gp2)

			# в противном случае берем случайный ген (мутация),
			else:
				child_chromosome.append(self.mutated_genes())


		return Individual(child_chromosome)

	def cal_fitness(self):
		'''
		Рассчитываем показатель соответствия, это количество
		символов в строке, которые отличаются от целевой
		строки.
		'''
		global TARGET
		fitness = 0
		for gs, gt in zip(self.chromosome, TARGET):
			if gs != gt: fitness+= 1
		return fitness

# Driver code
def main():
	global POPULATION_SIZE

	#Текущее поколение
	generation = 1

	found = False
	population = []

	# Новое поколение
	for _ in range(POPULATION_SIZE):
				gnome = Individual.create_gnome()
				population.append(Individual(gnome))

	while not found:

		# Отсортируем популяцию в порядке возрастания оценки соответствия целевой функции
		population = sorted(population, key = lambda x:x.fitness)

		# Если у нас появился индивид, достигший целевой функции
		# цикл совершенствования можно прервать
		if population[0].fitness <= 0:
			found = True
			break

		# В противном случае - продолжаем создавать новые поколения
		new_generation = []

		# Определяем 10% популяции, наиболее соответствующих целевой фукнции
		# чтобы передать их гены будущим поколениям
		s = int((10*POPULATION_SIZE)/100)
		new_generation.extend(population[:s])


		s = int((90*POPULATION_SIZE)/100)
		for _ in range(s):
			parent1 = random.choice(population[:50])
			parent2 = random.choice(population[:50])
			child = parent1.gene_transfer(parent2)
			new_generation.append(child)

		population = new_generation

		print("Generation: {}\tString: {}\tFitness: {}".
			format(generation,
			"".join(population[0].chromosome),
			population[0].fitness))

		generation += 1


	print("Generation: {}\tString: {}\tFitness: {}".
		format(generation,
		"".join(population[0].chromosome),
		population[0].fitness))

if __name__ == '__main__':
	main()

результат


Generation: 1	String: GPaC)i3=A9B}reQvaS( }x5
2u-h!	Fitness: 27
Generation: 2	String: GPaC)i3=A9B}reQvaS( }x5
2u-h!	Fitness: 27
Generation: 3	String: Ig?E%Pl,bDwyRejqH:.CKSH55k=T0	Fitness: 26
Generation: 4	String: XO PCxJI1Mi.h{/vcj
_U-pm!w$u0	Fitness: 25
Generation: 5	String: I[Z1ZiOCMCCoreB }76 Rrl8wup06	Fitness: 24
Generation: 6	String: Ig pZ,mlzMCoWer!ih5WRyH}wg Td	Fitness: 23
Generation: 7	String: :2fpri3I# NgherVw7(_ISum!wWwg	Fitness: 22
Generation: 8	String: Infpr(/IV Nghe;Ywq(ul!um,w#K0	Fitness: 21
Generation: 9	String: Infpr(/IV Nghe;Ywq(ul!um,w#K0	Fitness: 21
Generation: 10	String: Igfpri3I#aso er!i7#WLSum!wWwg	Fitness: 19
Generation: 11	String: Igfpri3I#aso er!i7#WLSum!wWwg	Fitness: 19
Generation: 12	String: In pZiY.]9soDer aw
H1%umfbf-0	Fitness: 18
Generation: 13	String: Id pri3m&@No erVUQ?KQWlm
Qb00	Fitness: 17
Generation: 14	String: Id pri3m&@No erVUQ?KQWlm
Qb00	Fitness: 17
Generation: 15	String: In pri37iQxorerVwQZt"WlmW2bd0	Fitness: 16
Generation: 16	String: In p8i?I; 6o erdUGXzLhum 2bN0	Fitness: 15
Generation: 17	String: In p8i?I; 6o erdUGXzLhum 2bN0	Fitness: 15
Generation: 18	String: In p8i?I; 6o erdUGXzLhum 2bN0	Fitness: 15
Generation: 19	String: In pZi!c#95o ex#%7Z}rfum  000	Fitness: 13
Generation: 20	String: In pZi!c#95o ex#%7Z}rfum  000	Fitness: 13
Generation: 21	String: In pZi!c#95o ex#%7Z}rfum  000	Fitness: 13
Generation: 22	String: In p/c3qi9{o erdtQ?2rhum 2b00	Fitness: 12
Generation: 23	String: In p/c3qi9{o erdtQ?2rhum 2b00	Fitness: 12
Generation: 24	String: In privcX:so eraUuZ]LhumW2000	Fitness: 11
Generation: 25	String: In privcX:so eraUuZ]LhumW2000	Fitness: 11
Generation: 26	String: In p[i?/ikio er#tQZ}.fum 2000	Fitness: 10
Generation: 27	String: In p[i?/ikio er#tQZ}.fum 2000	Fitness: 10
Generation: 28	String: In p[i?/ikio er#tQZ}.fum 2000	Fitness: 10
Generation: 29	String: In p[i?/ikio er#tQZ}.fum 2000	Fitness: 10
Generation: 30	String: In p[i?/ikio er#tQZ}.fum 2000	Fitness: 10
Generation: 31	String: In p[i?/ikio er#tQZ}.fum 2000	Fitness: 10
Generation: 32	String: In prcHci"io er#tN8Wr]umf2000	Fitness: 9
Generation: 33	String: Tn privci
{o erdt Z{rfum 2000	Fitness: 8
Generation: 34	String: Tn privci
{o erdt Z{rfum 2000	Fitness: 8
Generation: 35	String: Tn privci
{o erdt Z{rfum 2000	Fitness: 8
Generation: 36	String: Tn privci
{o erdt Z{rfum 2000	Fitness: 8
Generation: 37	String: Tn privci
{o erdt Z{rfum 2000	Fitness: 8
Generation: 38	String: Tn privci
{o erdt Z{rfum 2000	Fitness: 8
Generation: 39	String: Tn privci
{o erdt Z{rfum 2000	Fitness: 8
Generation: 40	String: In princi1io erxtNZ]rRum 200V	Fitness: 7
Generation: 41	String: In princi1io erxtNZ]rRum 200V	Fitness: 7
Generation: 42	String: In princi1io erxtNZ]rRum 200V	Fitness: 7
Generation: 43	String: In princi1io erxtNZ]rRum 200V	Fitness: 7
Generation: 44	String: In pri}cipio eratN{]rbuJ 2000	Fitness: 5
Generation: 45	String: In pri}cipio eratN{]rbuJ 2000	Fitness: 5
Generation: 46	String: In pri}cipio eratN{]rbuJ 2000	Fitness: 5
Generation: 47	String: In pri}cipio eratN{]rbuJ 2000	Fitness: 5
Generation: 48	String: In pri}cipio eratN{]rbuJ 2000	Fitness: 5
Generation: 49	String: In pri}cipio eratN{]rbuJ 2000	Fitness: 5
Generation: 50	String: In pri}cipio eratN{]rbuJ 2000	Fitness: 5
Generation: 51	String: In}pri}cipio erat Z]rbum 2000	Fitness: 4
Generation: 52	String: In}pri}cipio erat Z]rbum 2000	Fitness: 4
Generation: 53	String: In}pri}cipio erat Z]rbum 2000	Fitness: 4
Generation: 54	String: In}pri}cipio erat Z]rbum 2000	Fitness: 4
Generation: 55	String: In}pri}cipio erat Z]rbum 2000	Fitness: 4
Generation: 56	String: In}pri}cipio erat Z]rbum 2000	Fitness: 4
Generation: 57	String: In}pri}cipio erat Z]rbum 2000	Fitness: 4
Generation: 58	String: In prinJipio erat V2rbum 200:	Fitness: 3
Generation: 59	String: In prinJipio erat V2rbum 200:	Fitness: 3
Generation: 60	String: In prinJipio erat V2rbum 200:	Fitness: 3
Generation: 61	String: In prinJipio erat V2rbum 200:	Fitness: 3
Generation: 62	String: In prinJipio erat V2rbum 200:	Fitness: 3
Generation: 63	String: In prinJipio erat V2rbum 200:	Fitness: 3
Generation: 64	String: In principio erat ZHrbum 2000	Fitness: 2
Generation: 65	String: In principio erat ZHrbum 2000	Fitness: 2
Generation: 66	String: In principio erat ZHrbum 2000	Fitness: 2
Generation: 67	String: In principio erat ZHrbum 2000	Fitness: 2
Generation: 68	String: In principio erat ZHrbum 2000	Fitness: 2
Generation: 69	String: In principio erat ZHrbum 2000	Fitness: 2
Generation: 70	String: In principio erat ZHrbum 2000	Fitness: 2
Generation: 71	String: In principio erat ZHrbum 2000	Fitness: 2
Generation: 72	String: In principio erat ZHrbum 2000	Fitness: 2
Generation: 73	String: In principio erat ZHrbum 2000	Fitness: 2
Generation: 74	String: In principio erat ZHrbum 2000	Fitness: 2
Generation: 75	String: In principio erat ZHrbum 2000	Fitness: 2
Generation: 76	String: In principio erat ZHrbum 2000	Fitness: 2
Generation: 77	String: In principio erat ZHrbum 2000	Fitness: 2
Generation: 78	String: In principio erat ZHrbum 2000	Fitness: 2
Generation: 79	String: In principio erat ZHrbum 2000	Fitness: 2
Generation: 80	String: In principio erat ZHrbum 2000	Fitness: 2
Generation: 81	String: In principio erat -erbum 2000	Fitness: 1
Generation: 82	String: In principio erat -erbum 2000	Fitness: 1
Generation: 83	String: In principio erat -erbum 2000	Fitness: 1
Generation: 84	String: In principio erat -erbum 2000	Fitness: 1
Generation: 85	String: In principio erat -erbum 2000	Fitness: 1
Generation: 86	String: In principio erat -erbum 2000	Fitness: 1
Generation: 87	String: In principio erat -erbum 2000	Fitness: 1
Generation: 88	String: In principio erat -erbum 2000	Fitness: 1
Generation: 89	String: In principio erat -erbum 2000	Fitness: 1
Generation: 90	String: In principio erat -erbum 2000	Fitness: 1
Generation: 91	String: In principio erat -erbum 2000	Fitness: 1
Generation: 92	String: In principio erat -erbum 2000	Fitness: 1
Generation: 93	String: In principio erat -erbum 2000	Fitness: 1
Generation: 94	String: In principio erat -erbum 2000	Fitness: 1
Generation: 95	String: In principio erat -erbum 2000	Fitness: 1
Generation: 96	String: In principio erat -erbum 2000	Fitness: 1
Generation: 97	String: In principio erat -erbum 2000	Fitness: 1
Generation: 98	String: In principio erat -erbum 2000	Fitness: 1
Generation: 99	String: In principio erat -erbum 2000	Fitness: 1
Generation: 100	String: In principio erat -erbum 2000	Fitness: 1
Generation: 101	String: In principio erat -erbum 2000	Fitness: 1
Generation: 102	String: In principio erat -erbum 2000	Fitness: 1
Generation: 103	String: In principio erat -erbum 2000	Fitness: 1
Generation: 104	String: In principio erat -erbum 2000	Fitness: 1
Generation: 105	String: In principio erat -erbum 2000	Fitness: 1
Generation: 106	String: In principio erat -erbum 2000	Fitness: 1
Generation: 107	String: In principio erat -erbum 2000	Fitness: 1
Generation: 108	String: In principio erat -erbum 2000	Fitness: 1
Generation: 109	String: In principio erat -erbum 2000	Fitness: 1
Generation: 110	String: In principio erat -erbum 2000	Fitness: 1
Generation: 111	String: In principio erat -erbum 2000	Fitness: 1
Generation: 112	String: In principio erat -erbum 2000	Fitness: 1
Generation: 113	String: In principio erat -erbum 2000	Fitness: 1
Generation: 114	String: In principio erat -erbum 2000	Fitness: 1
Generation: 115	String: In principio erat -erbum 2000	Fitness: 1
Generation: 116	String: In principio erat -erbum 2000	Fitness: 1
Generation: 117	String: In principio erat -erbum 2000	Fitness: 1
Generation: 118	String: In principio erat -erbum 2000	Fitness: 1
Generation: 119	String: In principio erat -erbum 2000	Fitness: 1
Generation: 120	String: In principio erat -erbum 2000	Fitness: 1
Generation: 121	String: In principio erat -erbum 2000	Fitness: 1
Generation: 122	String: In principio erat -erbum 2000	Fitness: 1
Generation: 123	String: In principio erat -erbum 2000	Fitness: 1
Generation: 124	String: In principio erat -erbum 2000	Fitness: 1
Generation: 125	String: In principio erat -erbum 2000	Fitness: 1
Generation: 126	String: In principio erat -erbum 2000	Fitness: 1
Generation: 127	String: In principio erat -erbum 2000	Fitness: 1
Generation: 128	String: In principio erat -erbum 2000	Fitness: 1
Generation: 129	String: In principio erat -erbum 2000	Fitness: 1
Generation: 130	String: In principio erat -erbum 2000	Fitness: 1
Generation: 131	String: In principio erat -erbum 2000	Fitness: 1
Generation: 132	String: In principio erat -erbum 2000	Fitness: 1
Generation: 133	String: In principio erat -erbum 2000	Fitness: 1
Generation: 134	String: In principio erat -erbum 2000	Fitness: 1
Generation: 135	String: In principio erat -erbum 2000	Fitness: 1
Generation: 136	String: In principio erat -erbum 2000	Fitness: 1
Generation: 137	String: In principio erat -erbum 2000	Fitness: 1
Generation: 138	String: In principio erat -erbum 2000	Fitness: 1
Generation: 139	String: In principio erat Verbum 2000	Fitness: 0

Зачем использовать генетические алгоритмы?

Генетические алгоритмы способны решать сложные, многомерные проблемы, одновременно просматривая большой пул возможных решений.

Оптимальные результаты

Поскольку генетические алгоритмы основаны на принципе выживания наиболее приспособленных, они ориентированы на поиск оптимальных решений.

Обрабатывает шум и неполные данные

Генетические алгоритмы могут обрабатывать зашумленные и неполные наборы данных, часто создавая приемлемые решения там, где другие методы могут оказаться неэффективными.

Гибкий и адаптируемый

Эти алгоритмы являются гибкими и адаптируемыми, поскольку они не делают никаких предположений о проблемном пространстве и не зависят от проблемной области.

Ограничения генетических алгоритмов

Генетические алгоритмы часто требуют точной настройки таких параметров, как частота мутаций, скорость скрещивания и размер популяции, чтобы получить оптимальные результаты.

Нет гарантии оптимального решения

Хотя генетические алгоритмы хороши в поиске высококачественных решений, они не всегда гарантируют нахождение абсолютно лучшего решения.

Неясное время конвергенции

Время сходимости, время, необходимое алгоритму для достижения оптимального или близкого к оптимальному решения, не является определенным и различается от проблемы к проблеме.

Возможность преждевременной конвергенции

Генетические алгоритмы могут застрять на неоптимальных решениях — ситуация, известная как преждевременная сходимость.

Сферы применения генетических алгоритмов

img_2.png

Машинное обучение

Генетические алгоритмы используются в машинном обучении для оптимизации алгоритмов обучения , тем самым улучшая производительность модели.

Распознавание изображений

При распознавании изображений генетические алгоритмы играют ключевую роль в выборе признаков, тем самым повышая точность распознавания.

Инженерный дизайн

Генетические алгоритмы используются для оптимизации и предоставления надежных решений в инженерном проектировании. Способность быстро оценивать и генерировать потенциальные решения делает их ценными инструментами в этой области.

Маршрутизация трафика и поставок

Генетические алгоритмы были приняты многими торговыми компаниями для эффективного решения проблем с движением транспорта и маршрутизацией грузов. Они помогают сэкономить время и деньги за счет поиска оптимальных маршрутов.

Робототехника

Генетические алгоритмы играют важную роль в робототехнике. Их используют для создания обучающихся роботов, которые могут выполнять такие задачи, как приготовление еды или стирка. Имитируя процесс естественной эволюции, генетические алгоритмы помогают роботам вести себя больше как люди.

Colab paid products - Cancel contracts here

Contacts: teffal@mail.ru