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

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

新規登録して質問してみよう
ただいま回答率
85.48%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

2回答

915閲覧

pythonのlistやtapleについてです。

bbiiq

総合スコア51

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

0クリップ

投稿2021/07/22 10:08

編集2021/07/23 06:11

トーナメントのようなアルゴリズムを実装したいのですが、リストやタプルの理解が浅くうまくいきません。
for文の範囲が間違っていると思うのですが、うまくいきません。
どうしたらよいのでしょうか。
<試したこと>
for i in range(0,len(tournament)-1,tour_num):
と変更したが同じエラーのままで、
for i in range(0,len(tournament)-2,tour_num):
としたところ、結果が表示されない。

<変数>
len(tournament) = 10
tour_num = 2
です。

python

1def select(eva): 2 tournament = [()] 3 tournament.append(random.shuffle(eva)) 4 while len(tournament) > 1: 5 if len(tournament) % 2 != 0: 6 for i in range(1,len(tournament),tour_num): 7 if tournament[i][0] < tournament[i+1][0]: 8 del tournament[i][0] 9 else: 10 del tournament[i+1][0] 11 else: 12 for i in range(0,len(tournament),tour_num): 13 if tournament[i][0] < tournament[i+1][0]: 14 del tournament[i][0] 15 else: 16 del tournament[i+1][0] 17 18 return tournament

エラー

   38 else:
39 for i in range(0,len(tournament),tour_num):
---> 40 if tournament[i][0] < tournament[i+1][0]:
41 del tournament[i][0]
42 else:

IndexError: tuple index out of range

全体のコードも載せておきます。

python

1import random 2import copy 3 4random.seed(1870258) 5gene_length = 10 6# 遺伝子長 7individual_length = 10 # 個体数 8generation = 30 # 世代数 9tour_num = 2 #トーナメント数 10 11#二次元配列で遺伝子長と個体数を表現 12def get_population(): 13 population = [] 14 for i in range(individual_length): #遺伝子長 15 population.append([random.randint(0,1) for j in range(gene_length)]) #個体数 16 return population 17 18#適応度 19def fitness(pop): 20 return sum(pop) 21 22#評価 23def evaluate(pop): 24 pop.sort(reverse=True) 25 return pop 26 27#tトーナメント選択(次世代個体生成) 28def select(eva): 29 tournament = [()] 30 tournament.append(random.shuffle(eva)) 31 while len(tournament) > 1: 32 if len(tournament) % 2 != 0: 33 for i in range(1,len(tournament),tour_num): 34 if tournament[i][0] < tournament[i+1][0]: 35 del tournament[i][0] 36 else: 37 del tournament[i+1][0] 38 else: 39 for i in range(0,len(tournament),tour_num): 40 if tournament[i][0] < tournament[i+1][0]: 41 del tournament[i][0] 42 else: 43 del tournament[i+1][0] 44 45 return tournament 46 47 48#一点交叉 49def one_point_crossover(parent1, parent2): 50 r1 = random.randint(0, gene_length-1) 51 child1 = copy.deepcopy(parent1) 52 child2 = copy.deepcopy(parent2) 53 child1[r1:gene_length-1] = parent2[r1:gene_length-1] 54 child2[r1:gene_length-1] = parent1[r1:gene_length-1] 55 return child1,child2 56 57 58def main(): 59 # 初期個体生成 60 pop = evaluate([(fitness(p), p) for p in get_population()]) 61 print('Generation: 0') 62 print('Min : {}'.format(pop[-1][0])) 63 print('Max : {}'.format(pop[0][0])) 64 print('--------------------------') 65 66 for g in range(generation): 67 if 10 != pop[0][0] or 10 != pop[-1][0]: 68 69 g += 1 70 print('Generation: ' + str(g)) 71 72 73 eva = evaluate(pop) 74 tournament = select(eva) 75 pop = tournament 76 77 while len(pop) < individual_length: 78 m1 = random.randint(0, len(tournament)-1) 79 m2 = random.randint(0, len(tournament)-1) 80 child1,child2 = one_point_crossover(tournament[m1][1], tournament[m2][1]) 81 pop.append((fitness(child1), child1)) 82 pop.append((fitness(child2), child2)) 83 84 print('Min : {}'.format(pop[-1][0]),' Result : {}'.format(pop[-1])) 85 print('Max : {}'.format(pop[0][0]),' Result : {}'.format(pop[0])) 86 print('--------------------------') 87 else: 88 break 89 90 91 92 print('\n--------------------------End of evolution--------------------------') 93 print('Generation: ' + str(g)) 94 print('Min : {}'.format(pop[-1][0]),' Result : {}'.format(pop[-1])) 95 print('Max : {}'.format(pop[0][0]),' Result : {}'.format(pop[0])) 96 97 98 99if __name__ == '__main__': 100 main()

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

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

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

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

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

BeatStar

2021/07/22 23:41

デバッグぐらいはしましょう。 プログラミングは『書いて終わり』ではありません。 デバッグは必須の技術です。
guest

回答2

0

ベストアンサー

簡単な例で示します。

python

1a = [[1, 2], [3, 4], [5, 6]] 2 3for i in range(len(a)): 4 print(a[i+1]) 5# [3, 4] 6# [5, 6] 7# IndexError: list index out of range

1回目のループでa[1]の中身が表示されます。2回目のループでa[2]の中身が表示されます。3回目のループでa[3]を表示しようとしてIndexError: list index out of rangeが発生します。

対処法としては下記などがあります。

python

1a = [[1, 2], [3, 4], [5, 6]] 2 3for i in range(len(a)-1): 4 print(a[i+1]) 5# [3, 4] 6# [5, 6]

投稿2021/07/22 10:57

meg_

総合スコア10579

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

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

bbiiq

2021/07/23 05:36

回答ありがとうございます。 for i in range(0,10,2): の場合はiが10になった時点で終了すると思っていたのですが、10まで実行するんですね。ありがとうございます。 教えていただいた通り-1をした for i in range(0,len(tournament)-1,2): としましたが、同じエラーのままでした。
bbiiq

2021/07/23 05:47 編集

ステップの関係かと思い、 for i in range(0,len(tournament)-2,2): にしたところ何故か結果が表示されません。 私は何を勘違いしているんでしょうか。
meg_

2021/07/23 06:13

> iが10になった時点で終了すると思っていたのですが、10まで実行するんですね。 いいえ。10は実行されません。 > for i in range(0,len(tournament)-2,2): len(tournament)-1ではどうでしょうか?
bbiiq

2021/07/23 08:11

返信ありがとうございます。 10を実行しないのでしたらそもそもこのエラーは起きないと思うので悩んでいます。 for i in range(start:0,stop:10,step:2) i,i+1 i=0,2,4,6,8を実行。i=10で抜ける。 なのでエラーは起きないと思うのですがエラーが起きます。 len(tournament)-1も試しましたが同じエラーのままでした。
bbiiq

2021/07/23 08:12

print(len(tournament)) したところちゃんと10でした
meg_

2021/07/23 10:31

元のコードでエラーが発生しているのは「 if tournament[i][0] < tournament[i+1][0]:」の中の「tournament[i+1][0]」だと思いますよ。 「i+1」がIndexErrorを引き起こしていませんか?
bbiiq

2021/07/23 11:07

print(tournament[i][0]) print(tournament[i+1][0]) を入れてみたところ、i+1のところではなく、iのところでエラーが起きてます。        else: 39 for i in range(0,len(tournament),tour_num): ---> 40 print(tournament[i][0]) 41 print(tournament[i+1][0]) 42 if tournament[i][0] < tournament[i+1][0]: なのでpythonのfor文の終了条件は<や>ではなく<=や>=だと思いました。しかし、len(tournament)-1では同じエラー、len(tournament)-2では実行結果が表示されない。という状況です。
bbiiq

2021/07/23 11:14

原因がわかりました。 i+1ではなく、 tournament = [()] random.shuffle(eva) の部分っぽいです。 ありがとうございました。
meg_

2021/07/23 12:49

本当ですね。確認したところ、tournament[0]の中身が()ですね。そのためtournament[i][0]の[0]でIndexError発生ですね。
bbiiq

2021/07/23 13:55

色々ご迷惑かけてすいません。 ありがとうございました????‍♂️????‍♂️
guest

0

IndexError: tuple index out of range

要するに、範囲を超えてるってことです。
tournamentになにが入ってて、iはどうなってるのかチェックしよう

投稿2021/07/22 10:33

y_waiwai

総合スコア87747

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

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

bbiiq

2021/07/23 05:56

回答ありがとうございます。 範囲というのは、タプルの範囲でしょうか。それとも、for文の終了条件の範囲でしょうか。 タプルの範囲を超えないように変更しても同じエラーが起きるので教えていただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問