(PO)MDP 用のツールボックスを作成していますが、悪いパターンが発生しています。特に強化学習アルゴリズムを実装するときは、同じことを繰り返す傾向があります。次の疑似アルゴリズムを参照してください。
arguments: epsilon
v <- initial V values
c <- initial C values
while not good-enough
delta <- 0.0
if in-place
v_old <- copy(v)
else
v_old <- reference to v
for s in ss
a = some_value(s,old_v)
old_v <- v_old[s]
v[s] = c*a*v_old[s]
delta = max(delta,old_v-v[s])
if delta < epsilon
good-enough <- true
return v
このほぼ同一のアルゴリズムを見てください。
arguments: epsilon,gamma
v <- initial V values
c <- initial C values
while not good-enough
delta <- 0.0
if in-place
v_old <- copy(v)
else
v_old <- reference to v
for s in ss
a,o = get_a_and_o(s)
old_v <- v_old[s]
v[s] = c*v_old[s]*exp(o-a)
delta = max(delta,old_v-v[s])
if delta < epsilon(/1-gamma)
good-enough <- true
return v
これらのアルゴリズムにはいくつかの単純な違いがありますが、かなり繰り返しています。ここで私の質問は次のとおりです。これら 2 つのサンプル アルゴリズムの共通部分(実際のアルゴリズムに適用可能) をどのように抽象化しますか?
私は(Pythonで)1つのアプローチを見てきました。アルゴリズムに前、後、および反復ごとにそれぞれ呼び出される前、後、およびループ関数を与え、変数を保持するためにアルゴリズム状態辞書を渡しました。しかし、このアプローチはあまり良いものではありませんでした。助言がありますか?