質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
人工知能

人工知能とは、言語の理解や推論、問題解決などの知的行動を人間に代わってコンピューターに行わせる技術のことです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

遺伝的アルゴリズムの一様交叉についての質問です。

bbiiq
bbiiq

総合スコア7

人工知能

人工知能とは、言語の理解や推論、問題解決などの知的行動を人間に代わってコンピューターに行わせる技術のことです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

0評価

0クリップ

873閲覧

投稿2021/07/21 02:40

pythonで遺伝的アルゴリズムを使い、OneMax問題を解くプログラムを作成したいのですが、一様交叉の部分がうまくいっていません。エラーは起きていないのですが、配列に変化が起きていないので交叉の部分がよくないと考えているのですが、原因がわかりません。
何が悪いのか、これを試してはという意見がありましたら教えていただきたいです。

python3

import random import copy random.seed(1870258) gene_length = 10 # 遺伝子長 individual_length = 10 # 個体数 generation = 30 # 世代数 elite_rate = 0.2 # エリート選択の割合 #個体生成 def get_population(): population = [] for i in range(individual_length): #遺伝子長 population.append([random.randint(0,1) for j in range(gene_length)]) #個体数 return population #適応度 def fitness(pop): return sum(pop) #評価 def evaluate(pop): pop.sort(reverse=True) return pop #エリート選択 def select(eva,pop): elites = eva[:int(len(pop)*elite_rate)] return elites #一様交叉 def cxUniform(parent1, parent2): for i in range(len(parent1)): if random.random() < 0.5: parent1[i], parent2[i] = parent2[i], parent1[i] return random.choice([parent1,parent2]) def main(): # 初期個体生成 pop = evaluate([(fitness(p), p) for p in get_population()]) print('Generation: 0') print('Min : {}'.format(pop[-1][0])) print('Max : {}'.format(pop[0][0])) print('--------------------------') for g in range(generation): if 10 != pop[0][0] and 10 != pop[-1][0]: g += 1 print('Generation: ' + str(g)) #選択 eva = evaluate(pop) elites = select(eva,pop) #交叉 new_pop = elites while len(new_pop) < individual_length: m1 = random.randint(0, len(elites)-1) m2 = random.randint(0, len(elites)-1) child = cxUniform(elites[m1][1], elites[m2][1]) new_pop.append((fitness(child), child)) new_pop = evaluate(new_pop) print('Min : {}'.format(pop[-1][0]),' Result : {}'.format(pop[-1])) print('Max : {}'.format(pop[0][0]),' Result : {}'.format(pop[0])) print('--------------------------') else: break print('\n--------------------------End of evolution--------------------------') print('Generation: ' + str(g)) print('Min : {}'.format(pop[-1][0]),' Result : {}'.format(pop[-1])) print('Max : {}'.format(pop[0][0]),' Result : {}'.format(pop[0])) if __name__ == '__main__': main()

実行結果:
Generation: 0
Min : 2
Max : 8

Generation: 1
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 1, 1, 1, 1, 0, 1, 1, 1])

Generation: 2
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 0, 1, 1, 1])

Generation: 3
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 1, 1, 1, 1])

Generation: 4
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 1, 1, 1, 1, 0, 1, 1, 1])

Generation: 5
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 1, 1, 1, 1, 1, 1, 1, 1])

Generation: 6
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 0, 1, 1, 1, 0, 1, 1, 1])

Generation: 7
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 1, 0, 1, 1, 1, 1, 1, 1])

Generation: 8
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 1, 1, 1, 1])

Generation: 9
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 1, 0, 1, 1, 1, 1, 1, 1])

Generation: 10
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 1, 0, 1, 1, 1, 1, 1, 1])

Generation: 11
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 1, 1, 1, 0, 1, 1, 1])

Generation: 12
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 1, 0, 1, 1, 0, 1, 1, 1])

Generation: 13
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 0, 1, 1, 1])

Generation: 14
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 1, 0, 1, 1, 1, 1, 1, 1])

Generation: 15
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 0, 0, 1, 1, 1, 1, 1, 1])

Generation: 16
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 1, 1, 1, 0, 1, 1, 1])

Generation: 17
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 0, 1, 1, 1])

Generation: 18
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 1, 1, 1, 1, 1, 1, 1, 1])

Generation: 19
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 0, 0, 1, 1, 0, 1, 1, 1])

Generation: 20
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 1, 1, 1, 0, 1, 1, 1])

Generation: 21
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1])

Generation: 22
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 1, 1, 1, 1])

Generation: 23
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 1, 1, 1, 1])

Generation: 24
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 0, 1, 1, 1, 1, 1, 1, 1])

Generation: 25
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 0, 0, 1, 1, 0, 1, 1, 1])

Generation: 26
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 1, 0, 1, 1, 0, 1, 1, 1])

Generation: 27
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 1, 0, 1, 1, 0, 1, 1, 1])

Generation: 28
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 0, 0, 1, 1, 0, 1, 1, 1])

Generation: 29
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 0, 1, 1, 1])

Generation: 30
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 0, 1, 1, 1])

--------------------------End of evolution--------------------------
Generation: 30
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 0, 1, 1, 1])

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

人工知能

人工知能とは、言語の理解や推論、問題解決などの知的行動を人間に代わってコンピューターに行わせる技術のことです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。