2017-05-30 5 views
0

Markov Chainに関連するコードを見ていますが、このコードがどのように動作するのか分かりません。Python関数はインデックスだけを返します

transition_probabilities = [ 
     [[0.7, 0.3, 0.0], [1.0, 0.0, 0.0], [0.8, 0.2, 0.0]], # in s0, if action a0 then proba 0.7 to state s0 and 0.3 to state s1, etc. 
     [[0.0, 1.0, 0.0], None, [0.0, 0.0, 1.0]], 
     [None, [0.8, 0.1, 0.1], None], 
    ] 

rewards = [ 
     [[+10, 0, 0], [0, 0, 0], [0, 0, 0]], 
     [[0, 0, 0], [0, 0, 0], [0, 0, -50]], 
     [[0, 0, 0], [+40, 0, 0], [0, 0, 0]], 
    ] 

possible_actions = [[0, 1, 2], [0, 2], [1]] 

def policy_fire(state): 
    return [0, 2, 1][state] 

def policy_random(state): 
    return rnd.choice(possible_actions[state]) 

def policy_safe(state): 
    return [0, 0, 1][state] 

class MDPEnvironment(object): 
    def __init__(self, start_state=0): 
     self.start_state=start_state 
     self.reset() 
    def reset(self): 
     self.total_rewards = 0 
     self.state = self.start_state 
    def step(self, action): 
     next_state = rnd.choice(range(3), p=transition_probabilities[self.state][action]) 
     reward = rewards[self.state][action][next_state] 
     self.state = next_state 
     self.total_rewards += reward 
     return self.state, reward 

def run_episode(policy, n_steps, start_state=0, display=True): 
    env = MDPEnvironment() 
    if display: 
     print("States (+rewards):", end=" ") 
    for step in range(n_steps): 
     if display: 
      if step == 10: 
       print("...", end=" ") 
      elif step < 10: 
       print(env.state, end=" ") 
     action = policy(env.state) 
     state, reward = env.step(action) 
     if display and step < 10: 
      if reward: 
       print("({})".format(reward), end=" ") 
    if display: 
     print("Total rewards =", env.total_rewards) 
    return env.total_rewards 

for policy in (policy_fire, policy_random, policy_safe): 
    all_totals = [] 
    print(policy.__name__) 
    for episode in range(1000): 
     all_totals.append(run_episode(policy, n_steps=100, display=(episode<5))) 
    print("Summary: mean={:.1f}, std={:1f}, min={}, max={}".format(np.mean(all_totals), np.std(all_totals), np.min(all_totals), np.max(all_totals))) 
    print() 

16行目には、インデックスのみを返す関数があります。私はこのようなことは聞いたことがない。私がインデックスについて知っているのは、対応するl_valueがなければならないということです。インデックスは、配列内の要素をサブスクライブすることができます。あなたたちは何が起こっているか教えてくれますか?

+0

インデックスを返す際の問題は何ですか?それがプログラムのロジックの一部なら、それは問題ありません。おそらく返されたインデックスは、後で処理するために使われます。 – Nurjan

答えて

1

線15-16:

def policy_fire(state): 
    return [0, 2, 1][state] 

この関数はstate02の整数であり、そしてインデックスにリスト[0, 2, 1]がその値を使用し、得られた値が返され前提。だからpolicy_fire(1)2を返します。

この関数は、run_episodeで呼び出され、env.stateはパラメータとしてenv = MDPEnvironment()です。

+0

_l \ _value_はハードコードされており、次のインデックスはそれを正式に購読していますか? – user3551261

+0

はい、私はそれを "l_value"と呼んでいません。これは、次のインデックスに添字を付けられたリストリテラルです。 –

関連する問題