2017-05-02 18 views
1

私はPythonには新しく、再帰関数を書くのに苦労しています。 私は教授からの例として与えられたMATLABで動的なプログラミング機能のためのコード行があります。Pythonの再帰関数を使った動的プログラミング

function [policy,fstar] =StochasticInventoryControl(N,K,c,h,M,g,Dmax,p) 
    fstar=zeros(M+1,N+1); 
    for n=N:-1:1 
     for s=0:M 
     for x=0:M-s 
      temp=0; 
      for d=0:Dmax 
       temp=temp+p(d+1)*(g*min(s+x,d)+fstar(1+max(s+x-d,0),n+1)); 
      end 
      f(1+s,1+x)=-K*(x>0)-c*x-h*(s+x)+temp; 
     end 
     [fstar(1+s,n),policy(1+s,n)]=max(f(1+s,1:M-s+1)); 
     end 
    end 
    policy=policy-1; 
end 

私はPythonで再書き込みと同じ機能をしようとしている、と私が思いついたのこのコード:

def StochasticInventoryControl(N, K, c, h, M, g, Dmax, p): 
    fstar = zeros(M + 1, N + 1) 
    for n in range (N, 1, -1): 
     for s in range (0, M): 
      for x in range (0, M - s): 
       temp = 0 
      for d in range (0, Dmax): 
       temp = temp + p(d + 1)*(g*min(s + x, d) + fstar(1 + max(s + x - d,0), n + 1)) 
     f(1 + s, 1 + x).lvalue = -K * (x > 0) - c * x - h * (s + x) + temp 
    [fstar(1 + s, n), policy(1 + s, n)] = max(f(1 + s, n in range (1, M - s + 1)) 

最終行が間違っていますが、私はこのようにPythonで関数の再帰的関係を定義することはできません。どうすればPythonで最後の行を書くべきですか?

+0

あなたは '行列などのためnumpy'を使用していますか?あなたの 'zeros()'コールは、あなたのことを示唆しています。もしあなたがそうであれば、MATLABのバージョンに非常によく似たコードを書くことができるはずですが、 '[]'ではなく '()'でインデックスを付け、Pythonでは1から始まるインデックスではなく0を使います – Marius

答えて

0

まず、インデックスと範囲がオフになっています。ほとんどのプログラミング言語と同様に、Pythonのインデックスと範囲は0から始まり、範囲は半分開いています(最後の値は除外されています)ので、範囲内でその範囲を考慮する必要があります。

第2に、numpyはインデックス作成に角括弧を使用するため、f[s,x]ではなく、f(s,x)となります。

第三に、あなただけのMATLABのようにnumpyの配列でスライスを行うことができますが、あなたのアカウントにインデックスの違いと最後要素のインデックスを作成するためのx:y:zがMATLABにある間に、Pythonでのステップサイズであるという事実を取る必要があります中間要素はです。

第4に、インデントはPythonでは重要なので、MATLABの場合と同じようにインナーループをもう1段インデントする必要があります。

最後の行の最後の行についての質問は、最大値と最大インデックスの両方を処理するnumpyの関数はありません。

fstar[s, n-1] = np.max(f[s, :M-s+1]) 
policy[s, n-1] = np.argmax(f[s, :M-s+1])+1 

いっそnumpyの方法のアプローチを使用します:あなたはそうのように、インデックスの値とnp.argmaxためnp.maxを使用する必要が

fstar[s, n-1] = f[s, :M-s+1].max() 
policy[s, n-1] = f[s, :M-s+1].argmax()+1