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

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

新規登録して質問してみよう
ただいま回答率
85.35%
OpenAI Gym

OpenAI Gymは、強化学習を開発・強化するためのシミュレーション環境です。強化学習における実験や評価環境などを標準化し提供することを目的としています。さらに、結果をアップロードしたり、他の人の実行結果や実装を見ることも可能です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

0回答

1087閲覧

pythonのプログラムが途中でエラーになってしまいます

UNICO.SA

総合スコア7

OpenAI Gym

OpenAI Gymは、強化学習を開発・強化するためのシミュレーション環境です。強化学習における実験や評価環境などを標準化し提供することを目的としています。さらに、結果をアップロードしたり、他の人の実行結果や実装を見ることも可能です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

1クリップ

投稿2020/03/02 16:13

以下のコードを実行したところ、実行途中でエラーになってしまい原因がわからないので質問させていただきます

遺伝的アルゴリズムでOpenAI GymのCartPoleをやろうとしています。

実行結果の画像にあるように第1世代くらいまではちゃんと実行できるのですが、それ以降にエラーが出てきてしまいます。
第3世代まで実行されることもあります。

デバッガー?を使ってプログラムを順に追ってみたのですが、エラーが起きる世代になるとmain関数内の<<<<に示したプログラムを実行した後にif name = 'main': main()のところまで急に飛んでしまいました。

プログラミングを始めて間もなくコードも汚いかもしれませんが、少しでもアドバイスがあればご教示いただけると幸いです。

以下にコード全文とエラーを貼ります。

python

1import gym 2import random 3import copy 4 5# 遺伝子長 step数による 6# 世代数 評価の誤差が小さくなるまで 7# 選択 ランダム 8# 交叉 一様交叉 9# 突然変異確率 100世代毎に突然変異(とりあえずなし) 10# 突然変異 撹拌(とりあえずなし) 11# 個体集団 2500 indivisiual_size 12# 親個体群 500 select_pop_size 13# 交叉直後の子個体群 1500 14# 子個体群の選択 エリート 15# 選択後の子個体群 500 16# 個体更新 JGG 17 18indivisual_size = 2500 # 個体集団 19poplation_size = 500 # 親の個体群のサイズ 20selected_children_size = 500 # 子の個体群のサイズ 21generation = 0 # 世代を初期化 22ENV = 'CartPole-v0' # 学習環境 23crossover_num = 3 # 交叉回数 24 25 26# JGGクラス 27# len, exchange, select(親個体をメモリから削除もする) 関数を実装する 28class JGG: 29 def __init__(self, indivisual_size): 30 self.indivisual_size = indivisual_size 31 self.indivisual_group = [] 32 self.poplation_group = [] 33 self.children_group = [] 34 self.selected_children_group = [] 35 36 def len(self): 37 return len(self.indivisual_group) 38 39 def select(self, poplation_size): 40 # ランダムでindivisual_groupの中からpoplation_size分poplation_groupを取り出す 41 # また、取り出したpoplation_groupはindivisual_groupから削除する 42 random.shuffle(self.indivisual_group) 43 self.poplation_group = self.indivisual_group[:poplation_size+1] 44 del self.indivisual_group[:poplation_size+1] 45 46 return self.poplation_group 47 48 # 交叉する関数(とりあえず案) 49 # 1個体あたり3回交叉する 50 def crossover(self, crossover_num): 51 52 # for pop(親1) in poplation_group: 53 # poplation_groupから3個体をランダムで取り出して親1と交叉する 54 # return children_group(1500個体あるはず) 55 for pop_1 in self.poplation_group: 56 pop_1_copy = copy.deepcopy(pop_1) 57 for _ in range(crossover_num): 58 pop_i = random.sample(self.poplation_group, 1) 59 60 # pop_1 * pop_i 61 min_pop_num = min(len(pop_1), len(pop_i[0])) 62 if len(pop_1) > len(pop_i[0]): 63 pop_1_copy[-min_pop_num:] = pop_i[0] 64 self.children_group.append(pop_1_copy) 65 elif len(pop_i[0]) > len(pop_1_copy): 66 pop_i[0][-min_pop_num:] = pop_1_copy 67 self.children_group.append(pop_i[0]) 68 else: 69 self.children_group.append(pop_1_copy) 70 71 return self.children_group 72 73 74 # crossover後に行動させてみてdone(step)を調べる 75 # そしてステップ数を降順にソート 76 def action_after_crossover(self): 77 global env 78 children_group_2 = [] 79 index_list = [] 80 step_list = [] 81 82 # print(self.children_group[:5]) 83 84 for i, child in enumerate(self.children_group): 85 step = 0 86 child_2 = [] 87 env.reset() 88 for child_action in child: 89 action = child_action 90 state, reward, done, _ = env.step(action) 91 step += 1 92 child_2.append(action) 93 if done: 94 break 95 children_group_2.append(child_2) 96 index_list.append(i) 97 step_list.append(step) 98 99 dic = dict(zip(index_list, step_list)) 100 101 self.children_group = [] 102 103 for key, _ in sorted(dic.items(), key=lambda x: -x[1]): 104 self.children_group.append(children_group_2[key]) 105 106 return self.children_group 107 108 109 # 優秀な子個体を選択する関数(エリート選択) 110 # children_groupからランキング選択によりselected_children_groupを作る 111 def elite_select(self): 112 # ランキング選択方式によりselected_children_groupを作る 113 self.selected_children_group = self.children_group[:selected_children_size] 114 115 return self.selected_children_group 116 117 def exchange(self): 118 # selected_children_groupをindivisual_groupに加える 119 self.indivisual_group.append(self.selected_children_group) 120 121 122 123env = gym.make(ENV) 124 125# メイン関数 126def main(): 127 # フローを作成 128 # indivisual_groupがたまるまでランダムに行動 129 130 global env 131 132 model = JGG(indivisual_size) 133 for i in range(model.indivisual_size): 134 actions_list = [] 135 env.reset() 136 done = False 137 while not done: 138 action = env.action_space.sample() 139 actions_list.append(action) 140 state, reward, done, _ = env.step(action) 141 model.indivisual_group.append(actions_list) 142 143 if i % 50 == 0: 144 print('episode: {}'.format(i)) 145 print('finished to store memory') 146 147 islearned = False 148 generation = 0 149 while not islearned: 150 model.select(poplation_size=poplation_size) 151 model.crossover(crossover_num=crossover_num) 152 model.action_after_crossover() <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 153 model.elite_select() 154 model.exchange() 155 156 gene_length_list = [] 157 for i, _ in enumerate(model.selected_children_group): 158 gene_length_list.append(len(model.selected_children_group[i])) 159 gene_length_average = sum(gene_length_list) / selected_children_size 160 161 print('第 {} 世代 > 平均遺伝子長: {}'.format(generation,gene_length_average)) 162 163 164 if gene_length_average > 190: 165 islearned = True 166 167 generation += 1 168 169 170 print('Evolved') 171 172 173if __name__ == '__main__': 174 main()

以下がエラーとなります。

イメージ説明

以下はエラー(下2行)から飛んだコードになります
エラーが出ている行を<<<<で示します

######time_limit.py

def step(self, action): assert self._elapsed_steps is not None, "Cannot call env.step() before calling reset()" observation, reward, done, info = self.env.step(action) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< self._elapsed_steps += 1 if self._elapsed_steps >= self._max_episode_steps: info['TimeLimit.truncated'] = not done done = True return observation, reward, done, info

######cartpole.py

def step(self, action): assert self.action_space.contains(action), "%r (%s) invalid"%(action, type(action)) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< state = self.state x, x_dot, theta, theta_dot = state force = self.force_mag if action==1 else -self.force_mag costheta = math.cos(theta) sintheta = math.sin(theta) temp = (force + self.polemass_length * theta_dot * theta_dot * sintheta) / self.total_mass thetaacc = (self.gravity * sintheta - costheta* temp) / (self.length * (4.0/3.0 - self.masspole * costheta * costheta / self.total_mass)) xacc = temp - self.polemass_length * thetaacc * costheta / self.total_mass if self.kinematics_integrator == 'euler': x = x + self.tau * x_dot x_dot = x_dot + self.tau * xacc theta = theta + self.tau * theta_dot theta_dot = theta_dot + self.tau * thetaacc else: # semi-implicit euler x_dot = x_dot + self.tau * xacc x = x + self.tau * x_dot theta_dot = theta_dot + self.tau * thetaacc theta = theta + self.tau * theta_dot self.state = (x,x_dot,theta,theta_dot) done = x < -self.x_threshold \ or x > self.x_threshold \ or theta < -self.theta_threshold_radians \ or theta > self.theta_threshold_radians done = bool(done) if not done: reward = 1.0 elif self.steps_beyond_done is None: # Pole just fell! self.steps_beyond_done = 0 reward = 1.0 else: if self.steps_beyond_done == 0: logger.warn("You are calling 'step()' even though this environment has already returned done = True. You should always call 'reset()' once you receive 'done = True' -- any further steps are undefined behavior.") self.steps_beyond_done += 1 reward = 0.0 return np.array(self.state), reward, done, {}

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問