web-dev-qa-db-ja.com

バイナリリストの5つの値をランダムに変更する方法は?

バイナリリストgenotypeから5つの数値を選択して反転する必要がある遺伝的アルゴリズムを書いているので、_1_→_0_および_0_→_1_。 range(1,6)を使用してコードをループに入れてみましたが、これを行っても、変更されるのはいずれかの数値のみです。以下は、バイナリ値の1つをランダムに選択して変更するループのない元のコードです。これを行うためのより良い方法を知っている人はいますか?

_genotype = [1,0,0,1,0,0,1,1,1,0]

def mutate(self):
  gene = random.choice(genotype)
  if genotype[gene] == 1:
    genotype[gene] = 0
  else:
    genotype[gene] = 1
  return genotype

_
4
J French

あなたの質問は、ソフトウェアエンジニアリングの問題に対するものであり、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))
1
Jay Patel