Ваш вопрос больше относится к проблеме разработки программного обеспечения, а не к стороне EA. Но я хотел бы дать несколько советов по поводу вашего дизайнерского решения по выбору 5 генов из генома. Вы ограничиваете EA исследовать пространство поиска для ваших решений, и ваш EA определенно может застрять в локальных оптимумах и не сможет сбежать, поскольку мутировавшие решения будут изменены только вокруг 5 генов (если ограничение связано с самой проблемой, ничего не могу с этим поделать). Например, EA может найти почти оптимальное решение, просто изменив 3 гена или изменив 7 генов. Если это выбор дизайна, вы можете рассмотреть возможность пересмотра своего дизайнерского решения для EA.
В целом сообщество EA использует вероятность мутации для генов. Когда кто-то хочет мутировать потомство, он основан на вероятности мутации гиперпараметра (Кроме того, поскольку это гиперпараметр, вы также можете настроить его для своей проблемы, чтобы позже достичь хороших результатов).
Допустим, ваше проектное решение мутации 5 генов является ограничением, и вы также хотели бы использовать настраиваемую вероятность мутации гиперпараметров. У вас может быть свое решение, как показано ниже:
import random
def mutate(genotype, m_probe):
mutated_offspring = []
mutated_genes_indexes = set()
for index, gene in enumerate(genotype):
if random.uniform(0, 1) >= m_probe and len(mutated_genes_indexes) < 5:
mutated_offspring.append(int(not gene))
mutated_genes_indexes.add(index)
else:
mutated_offspring.append(int(gene))
print("Mutated genes indexes: ", mutated_genes_indexes)
return mutated_offspring
# Each genes have 20% probability to get mutated! NOTE: with higher probability you might not find 5 genes mutated, 20 is chosen based on the constraint and can be tuned later with this constraint.
genotype = [1,0,0,1,0,0,1,1,1,0]
print(mutate(genotype, 0.20))
Мое предпочтительное дизайнерское решение было бы равным шансом для всех генов мутировать без ограничений. В этом случае решение может выглядеть следующим образом:
import random
def mutate(genotype, m_probe):
mutated_offspring = []
mutated_genes_indexes = set()
for index, gene in enumerate(genotype):
if random.uniform(0, 1) >= m_probe:
mutated_offspring.append(int(not gene))
mutated_genes_indexes.add(index)
else:
mutated_offspring.append(int(gene))
print("Mutated genes indexes: ", mutated_genes_indexes)
return mutated_offspring
genotype = [1,0,0,1,0,0,1,1,1,0]
print(mutate(genotype, 0.50))