中級 0件解決済み 正答率0%

価値反復法

ベルマン最適方程式による更新を繰り返し、マルコフ決定過程の各状態の価値を計算します。

このチャレンジで学べること

  • ベルマン最適方程式による更新を適用する
  • スイープごとに状態価値を計算する
  • 意思決定を状態、行動、報酬で表す

問題

原文(英語)を表示

価値反復法はマルコフ決定過程を解きます。状態 s から始めて得られる割引報酬の合計の最大値 V(s) を求めます。

ここでは遷移は決定的です。状態 s で行動 a を取ると報酬 rewards[s][a] を得て状態 next_states[s][a] に移ります。-1 はエピソードの終了を意味します。すべての状態で V(s) = 0 から始め、iterations 回繰り返します。新しい値はすべて前回のスイープの値から計算します。

V_new(s) = a についての ( rewards[s][a] + gamma × V(next_states[s][a]) ) の最大値

ただし次の状態が -1 のとき、gamma × V の項は 0 です。

value_iteration(next_states, rewards, gamma, iterations) を実装してください。

入力

next_states: 各状態について、各行動の次の状態 (-1 はエピソード終了)。状態ごとに行動の数が異なることがあります。

rewards: 各行動の報酬。next_states と同じ形です。

gamma: 割引率。

iterations: スイープの回数。

出力

最後のスイープ後の V を、状態ごとに 1 つずつ返します。

制約

1 ≤ 状態数 ≤ 200、1 ≤ 状態あたりの行動数 ≤ 10、0 ≤ iterations ≤ 1,000

-100 ≤ 各報酬 ≤ 100、0 ≤ gamma ≤ 1

例

例 1
入力:
gamma = 0.9
rewards = [
    [0.0, 0.0],
    [0.0, 0.0],
    [10.0]
]
iterations = 3
next_states = [
    [0, 1],
    [0, 2],
    [-1]
]

期待される出力:
expected = [8.1, 9.0, 10.0]
入力:
double gamma = 0.9;
std::vector<std::vector<double>> rewards = {
    {0.0, 0.0},
    {0.0, 0.0},
    {10.0}
};
long long iterations = 3;
std::vector<std::vector<long long>> next_states = {
    {0, 1},
    {0, 2},
    {-1}
};

期待される出力:
std::vector<double> expected = {8.1, 9.0, 10.0};
入力:
double gamma = 0.9;
double[][] rewards = new double[][] {
    new double[] {0.0, 0.0},
    new double[] {0.0, 0.0},
    new double[] {10.0}
};
long iterations = 3;
long[][] next_states = new long[][] {
    new long[] {0, 1},
    new long[] {0, 2},
    new long[] {-1}
};

期待される出力:
double[] expected = new double[] {8.1, 9.0, 10.0};

解説

スイープ 1: 報酬を得られるのは状態 2 だけで V = [0, 0, 10]。スイープ 2: 状態 1 は右へ移って 0.9 × 10 = 9、V = [0, 9, 10]。スイープ 3: 状態 0 は 0.9 × 9 = 8.1。結果: [8.1, 9, 10]。

例 2
入力:
gamma = 0.0
rewards = [
    [1.0, 2.0],
    [3.0, 0.0]
]
iterations = 5
next_states = [
    [1, 0],
    [0, 1]
]

期待される出力:
expected = [2.0, 3.0]
入力:
double gamma = 0.0;
std::vector<std::vector<double>> rewards = {
    {1.0, 2.0},
    {3.0, 0.0}
};
long long iterations = 5;
std::vector<std::vector<long long>> next_states = {
    {1, 0},
    {0, 1}
};

期待される出力:
std::vector<double> expected = {2.0, 3.0};
入力:
double gamma = 0.0;
double[][] rewards = new double[][] {
    new double[] {1.0, 2.0},
    new double[] {3.0, 0.0}
};
long iterations = 5;
long[][] next_states = new long[][] {
    new long[] {1, 0},
    new long[] {0, 1}
};

期待される出力:
double[] expected = new double[] {2.0, 3.0};

解説

gamma = 0 では将来が考慮されないので、各状態の価値は最良の即時報酬そのものです: [2, 3]。

参考資料

この課題はCodeUtility用に調整されています。上記の説明と制約に従ってください。

他の人の解答から学ぶ

コミュニティの解答

まだ公開された解答がありません。この課題を解いて最初の解答を共有しましょう。