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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

806閲覧

エラーが解決できません。 'float' object is not iterable

python6051

総合スコア8

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2020/05/05 05:27

ワンマックス問題のコードを書いています。
エラーの処理ができず、困っているためご教授いただければ幸いです。
コードは以下のようなものを書いています。

python3

1#条件設定 2length = 100 #染色体の長さ 3population = 100 #各世代の染色体の数 4new_population = 50 #子孫の数 5mutation_rate = 0.01 #突然変異する確率 6generationcount = 100 #最大世代数 7 8#初期個体群の生成 9import random 10import copy 11def production(length,population): 12 gene = [[random.randint(0,1) for i in range(length)] for j in range(population)] 13 return gene 14 15#適応度の評価 16def evaluation(gene): 17 evaluate = [] 18 for i in range(population): 19 evaluate.append(sum(gene[i])/length) 20 21 return evaluate 22 23#最小値の探索 24def find_min(evaluate): 25 min = 5 26 for i in range(population): 27 if evaluate[i] < min: 28 min = evaluate[i] 29 return min 30 31#最大値の探索 32def find_max(evaluate): 33 max = 0 34 for i in range(population): 35 if evaluate[i] > max: 36 max = evaluate[i] 37 return max 38 39#親選択 40def choice(gene,evaluate): 41 father_index = random.randint(0,99) 42 mother_index = random.randint(0,99) 43 if evaluate[father_index] > evaluate[mother_index]: 44 parent = gene[father_index] 45 else: 46 parent = gene[mother_index] 47 return parent 48 49#交叉 50def crossover(father,mother): 51 offspring = [] 52 for i in range(length): 53 p = random.random() 54 if p < 0.5: 55 offspring.append(father[i]) 56 else: 57 offspring.append(mother[i]) 58 return offspring 59 60#突然変異 61def mutation(gene,offspring): 62 for i in range(population): 63 p = random.random() 64 if p < mutation_rate: 65 if offspring[i] == 0: 66 offspring[i] = 1 67 else: 68 offspring[i] = 0 69 return offspring 70 71#エリート主義 72def elite(evaluate,gene,new_gene): 73 sort_evaluate = sorted(evaluate, reverse=True) 74 gene_tmp =[] 75 for i in range(new_population): 76 gene_index = evaluate.index(sort_evaluate[i]) 77 gene_tmp.append(gene[gene_index]) 78 gene_tmp.append(new_gene) 79 return gene_tmp 80 81#繁殖を行っていく 82def main(): 83 generationcount = 1 84 gene = production(length,population) 85 new_gene = [] 86 87 while generationcount <= 100: 88 new_gene.clear() 89 90 evaluate = evaluation(gene) 91 min = find_min(evaluate) 92 max = find_max(evaluate) 93 94 print("generation: "+ str(generationcount)) 95 print("MIN: " + str(min)) 96 print("MAX: " + str(max)) 97 if min == 100: 98 break 99 100 for i in range(new_population): 101 father = choice(gene,evaluate) 102 mother = choice(gene,evaluate) 103 104 offspring = crossover(father,mother) 105 offspring = mutation(gene,offspring) 106 new_gene.append(offspring) 107 108 gene = elite(gene,evaluate,new_gene) 109 generationcount += 1 110 print("---------------------------") 111 112if __name__ == "__main__": 113 main()

上記のコードを実行したところ以下のようなエラーが出ました。

error

1<ipython-input-92-ca83b1e4f9ad> in evaluation(gene) 2 2 evaluate = [] 3 3 for i in range(population): 4----> 4 evaluate.append(sum(gene[i])/length) 5 5 6 6 return evaluate 7 8TypeError: 'float' object is not iterable

自分で少し調べてみたところ、似た質問があったのですがうまく修正することができませんでした。
解決策を教えていただければ幸いです。
よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yasumichi

2020/05/05 05:40

Python 3.x - python3.6でiterableエラーが出ました。|teratail https://teratail.com/questions/108226 同じ対処法ではダメかもしれませんが、一度、回答を読んで考えてみてください。
python6051

2020/05/05 12:53

ゆっくり考えてみたいと思います。
guest

回答2

0

ベストアンサー

2回目のループでエラーが出ますね。
gene = elite(gene,evaluate,new_gene)の後にevaluate = evaluation(gene)を実行することでエラーが発生しています。evaluation()で処理できる形にgeneがなっているか確認してください。

※各関数の内容については検証していません。

投稿2020/05/05 05:58

meg_

総合スコア10760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

python6051

2020/05/05 12:54

途中の関数が機能していなかったみたいです! ありがとうございます!
guest

0

1回目のwhile loopではgene[i]のtypeはlistです。
2回目のloopではこれが演算されてfloatになっています。
エラーの原因はfloatに対してsumしようとしているからです。

変数geneの処理を見直すと良いと思います。

投稿2020/05/05 05:56

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

python6051

2020/05/05 12:56

geneのリストがうまく作れていなかったので、そもそも機能していなかったみたいです... ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問