質問編集履歴

1

修正したコード、エラー文の掲載

2022/07/14 06:15

投稿

AI_engineer
AI_engineer

スコア15

test CHANGED
File without changes
test CHANGED
@@ -77,4 +77,55 @@
77
77
  木構造から数式を生成する関数です。ここのexpの処理を変えるべきだと思っています。
78
78
  現段階ではexp(x)をそのままreturnするとなっているため、最終的に生成される数式で指数関数と多項式の合成形を作れないのだろうと考えています。ですが、実装力の問題でどのようにコードを書けばよいか思い浮かばず困っています。
79
79
 
80
+ ### 修正後のコード
81
+ expを終端記号から非終端記号に変更するとよいとのアドバイスをいただいたので、自分なりにコードを修正してみました。
80
82
 
83
+ ```python
84
+ # exp()を非終端記号に変更
85
+ def add(x, y): return x + y
86
+ def sub(x, y): return x - y
87
+ def mul(x, y): return x * y
88
+ def div(x, y): return 1 if y == 0 else x / y
89
+ def exp(x): return np.exp(x)
90
+
91
+ FUNCTIONS = [add, sub, mul, div, exp]
92
+ TERMINALS = ['x', -2, -1, 0, 1, 2]
93
+
94
+
95
+ # exp(x)の子ノードの部分木をxに代入するように変更
96
+ def random_tree(self, grow, max_depth, depth = 0): # create random tree using either grow or full method
97
+ """初期集団の生成
98
+
99
+ Args:
100
+ grow (_type_): FUNCTIONから選ぶかを操作
101
+ max_depth (_type_): 木の深さの上限
102
+ depth (int, optional): 現在の木の深さ. Defaults to 0.
103
+ """
104
+ if depth < MIN_DEPTH or (depth < max_depth and not grow):
105
+ self.data = FUNCTIONS[randint(0, len(FUNCTIONS)-1)]
106
+ elif depth >= max_depth:
107
+ self.data = TERMINALS[randint(0, len(TERMINALS)-1)]
108
+ else: # intermediate depth, grow # grow=True且つdepth < max_depth
109
+ if random () > 0.5:
110
+ self.data = TERMINALS[randint(0, len(TERMINALS)-1)]
111
+ else:
112
+ self.data = FUNCTIONS[randint(0, len(FUNCTIONS)-1)]
113
+ # 右と左の木を生成
114
+ if self.data == exp:
115
+ self.left = GPTree()
116
+ self.left.random_tree(grow, max_depth, depth = depth + 1)
117
+ elif self.data in FUNCTIONS:
118
+ self.left = GPTree()
119
+ self.left.random_tree(grow, max_depth, depth = depth + 1) # 木の深さを更新
120
+ self.right = GPTree()
121
+ self.right.random_tree(grow, max_depth, depth = depth + 1)
122
+ ```
123
+
124
+ これを実行すると、
125
+ >RuntimeWarning: overflow encountered in exp
126
+ > def exp(x): return np.exp(x)
127
+ > a.py:156: RuntimeWarning: overflow encountered in double_scalars
128
+ >return sum([((individual.compute_tree(ds[0])*np.sqrt(2*np.pi)) - ds[1]) ** 2 for ds in dataset])
129
+ などのエラーがでてしまい、解決方法がわからず困っています。
130
+ エラー文について調べて、指数関数expは膨大な値になるためオーバーフローしたのだと考えていますが、改善の仕方がわかりません...
131
+