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

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

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

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

Q&A

解決済

1回答

2423閲覧

python sum関数でエラーについて

papikonoqui

総合スコア10

Python

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

0グッド

0クリップ

投稿2021/04/26 13:38

編集2021/04/26 14:34

前提・実現したいこと

遺伝的アルゴリズムでOneMax問題を解くプログラムをpythonで実装しようと考えています。
エラーコードの意味は分かりましたが、なぜそのエラーがでたのかはわかりませんでした。
どなたかお力添えいただけると幸いです。

発生している問題・エラーメッセージ

エラーはevaluation関数の
fitness.append(sum(gene[i]))
で発生しています。

TypeError: unsupported operand type(s) for +: 'int' and 'list'

該当のソースコード

以下のコードは
first_generation():要素数10の0と1のビット配列を100個生成→リストgeneに100個体を格納
evaluation(gene):要素の合計を適応度とし、100個体分の適応度をリストfitnessに格納
main(): 他関数の呼び出しを行う。
となっています

def first_generation(): gene = [[random.randint(0, 1) for i in range(10)] for j in range(100)] return gene def evaluation(gene): fitness = [] for i in range(100): fitness.append(sum(gene[i])) return fitness def main(): gene = first_generation() next_gene = [] count_a = 0 while count_a < generation: fitness = evaluation(gene) generation_evaluation(fitness, count_a+1) elite = elite_selection(gene, fitness) # 優秀な30個体はそのまま引き継がれる next_gene.append(elite) count_b = 0 while count_b < child_n: # 生成する子個体の数は70 parents = tournament_selection(gene, fitness) child = cross(parents) child = mutation(child) next_gene.append(child) count_b += 1 gene = copy.deepcopy(next_gene) count_a += 1

試したこと

この遺伝的アルゴリズムを実装しているファイルとは別に個体数などを少なくしただけのファイルで実装したところ、問題なく実行できました。

補足情報(FW/ツールのバージョンなど)

個体が格納されているgeneの例
[ [1, 1, 0, 0, 1, 0, 0, 1, 1, 0], [0, 0, 0, 1, 1, 0, 1, 0, 1, 1], .....]

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

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

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

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

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

mather

2021/04/26 14:10

evaluation(gene) を呼び出しているコードを提示してください。 上の関数で gene は変数名として使われていますが、下の関数とどう関係するんですか?
papikonoqui

2021/04/26 14:29

失礼いたしました。 main関数のコードを追記しました。
mather

2021/04/26 14:30

内容のわからない関数がいっぱい出てきましたが、結局エラーコードはどの行で発生しているんですか…?
papikonoqui

2021/04/26 14:36

訂正しました。 エラーはevaluation関数のfitness.append(sum(gene[i]))で発生しています。
guest

回答1

0

ベストアンサー

シンプルな方法ですが、 print(gene) を挟んでみてください。

python

1 while count_a < generation: 2 print(gene) 3 fitness = evaluation(gene)

整数のみの配列なら sum が適用できますが、部分的に配列だったり二次元配列だと該当のエラーになります。

>>> sum([1,2,3]) 6 >>> sum([[1,2],[3]]) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'int' and 'list' >>> sum([1,2,[3]]) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'int' and 'list'

投稿2021/04/26 14:42

mather

総合スコア6753

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問