私は遺伝的アルゴリズムに不慣れで、Pythonの実装に取り組んでいます。私はクロスオーバーのステップまで進んでおり、部分的に一致したクロスオーバーを試みています。最終的な出力では、重複する番号が含まれていないリストを期待しています。ただし、場合によっては、重複を導入しています。たとえば、リストを取る
Mate 1 [1,2,3,5,4,6]
Mate 2 [6,5,4,3,2,1]
クロスオーバー部分が [3,5,4] -> [4,3,2]
次に、マッピング前の子孫はになり[1,2,4,3,2,6]
ます。アルゴリズムの私の理解は、クロスオーバーの外側のマッピングです4 -> 3, 5 -> 3 and 2 -> 4
。ただし、これにより、出力[1,4,4,3,2,6]
が重複し、5が欠落します。
この問題を回避するにはどうすればよいですか?最初の4つは5になりますか?そして、これは、複数の重複を導入する可能性のあるより大きなリストにどのように拡張されますか?
あなたがそれを正しく実装したかどうかはわかりません:
部分的に一致したクロスオーバー(説明を参照)の場合、例で提案されているようにクロスオーバーポイントが2と5の場合、取得できるのは
offspring1 = [6, 2, 3, 5, 4, 1]
offspring2 = [1, 5, 4, 3, 2, 6]
3,5,4
mate1から選択し、残りをmate2の順序で入力すると、子孫1が取得されますが4,3,2
、mate2から選択し、残りをmate 1の順序で入力すると、子孫2が取得されます。
以下の実装を参照してください。
mate1 = [1,2,3,5,4,6]
mate2 = [6,5,4,3,2,1]
crossoverpoint1 = 2
crossoverpoint2=5
child = []
#fill in the initial genes in order of mate1
count = 0
for i in mate1:
if(count == crossoverpoint1):
break
if(i not in mate2[crossoverpoint1:crossoverpoint2]):
child.append(i)
count= count+1
#select the genes within the crossover points from mate2
child.extend(mate2[crossoverpoint1:crossoverpoint2])
#fill in the remaining genes in order of mate1
child.extend([x for x in mate1 if x not in child])
print(child)
出力:
[1, 5, 4, 3, 2, 6]
offspring1を取得するには、mate1をmate2に交換します。さまざまなクロスオーバーポイントを試すこともできます。これが役立つかどうか教えてください
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加