Open HashiReo opened 3 weeks ago
データ:「PVout =0, price = 0.01, imbalance = 200」をtrain_dataとして、input_data2022.csvに1か月間だけ登録し、RLに学習させる。 期待されるシナリオ:以下の2つの要因から、「充放電しない」はず。つまりグラフが全て0になってほしい
上手くいかない場合:1か月間だけでなく、登録期間を増やし再度行う。
次のシナリオ:PVoutとpriceはそのままでimbalanceを減らしていくとどうなるか?→同じ結果が得られてほしい
input_data2022.csvに任意のデータを登録するにあたって、csvファイルの日付データで存在しない日付が存在しているため、日付を修正する。(例:2022/04/31)
日付修正に加え、PVoutがマイナスになっているデータがあったため、マイナスの場合はすべて0にした。 以下が結果である。
SoC_bid[%]がほぼずっと100%なのが影響しているのかもしれない。 SoCの状態もRLのテストに観測値として入れているので、入れるなら正しい値を入れないとおかしくなる。
1つデータを取って考えてみる。
battery_max_cap = 4[kWh]
inverter_max_cap = 4[kWh]
SoCの初期値は0.5 (= 50%)、つまり現在のSoCは2.0[kWh]である。
以上がまず、初期条件として与えられている。
RLの最初のaction_scaledは-2.0[kWh]、つまり2.0[kWh]放電するのでnew_SoCは0[%]になるはずである。
しかし、データ上ではnextSoC = 100[%]となっている。ここがおかしい。
new_soc = current_soc - (action_scaled / self.env.battery_max_cap)
RL_test.pyのこのコードがおかしい。action_scaledがマイナスの時は放電を意味し、プラスの時に充電を表すはずだが、このコードは逆になっている。
よってnew_soc = current_soc + (action_scaled / self.env.battery_max_cap)
プラスに直した。
RL_test.pyのbidとrealtimeの両方を直した。
直した後、再度実行してみると次はSoC_bid(new_SoCのデータ群)はずっと0[%]だが、charge/discharge_bid( = action_scaledのデータ群)はずっと-2.0[kWh]でずっと放電している。 これはたぶんモデルがおかしい気がする、なので次はモデルを調べる。
モデル構築について調べる。
RL_env.pyのモデルの学習でも式が
new_soc = self.soc_list[-1] - (action_value / self.battery_max_cap)
となっているため
new_soc = self.soc_list[-1] + (action_value / self.battery_max_cap)
プラスに直した。
これで再度学習させてみる。
結果、特に変わらず。 ずっと2.0放電することはなくなったが、常に充電している。つまりcharge/discharge_bidの値が常に正。 なのに、SoC_bidはずっと100%というおかしい状況になっている。 これはSoCが満タンなのに常に充電しているためである。加えて、SoCを0~100の間にクリップしているからデータ上では100と出てくるが、実際に計算すると100を超えている。これはモデルがSoCが100を超えても大丈夫という風に認識しているためであると考えられる。おそらく、ありえない状況に対してペナルティが機能していないと予想される。これまでペナルティに関しては全く見ていなかったため、次からはペナルティに関して調べる。
モデル学習でのエピソード報酬は正になった。これが正しいのかどうかも分からないが。上が今までのエピソード報酬、下がこれまでの修正後のエピソード報酬である。
@HashiReo かなりいい感じに進んでると思う。そして説明の書き方がわかりやすい。素晴らしい。 結果がすぐによくならないから手応えがあまりないかもしれないけど、この辺の手触りのある実装を理解していくことが一番重要です。根気よくこのまま進めてほしいです。大曽根さんとも話して見解をもらってほしいです。
最終的なゴール
シナリオ
結果
関連Issue
以下のIssueから続いている