python中带递归函数的动态规划

python中带递归函数的动态规划,python,matlab,recursion,dynamic,Python,Matlab,Recursion,Dynamic,我是python新手,正在努力编写递归函数。 我在Matlab中有一个动态规划函数的以下代码行,作为一位教授的示例: 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:D

我是python新手,正在努力编写递归函数。 我在Matlab中有一个动态规划函数的以下代码行,作为一位教授的示例:

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编写最后一行?

首先,您的索引和范围已关闭。与大多数编程语言一样,python索引和范围以0开头,而范围是半开的(不包括最后一个值),因此在范围中需要考虑这一点

其次,numpy使用方括号进行索引,因此它应该是
f[s,x]
而不是
f(s,x)

第三,您可以像在MATLAB中一样在numpy数组中进行切片,但是您需要考虑索引的差异,并且对于
x:y:z
索引,在Python中最后一个元素是步长,而在MATLAB中中间元素是步长

第四,缩进在Python中非常重要,因此您的内部循环需要缩进一个级别,才能像在MATLAB中一样工作

至于您关于最后一行的问题,在numpy中没有一个函数同时处理max value和max index。您需要对值使用
np.max
,对索引使用
np.argmax
,如下所示:

fstar[s, n-1] = np.max(f[s, :M-s+1])
policy[s, n-1] = np.argmax(f[s, :M-s+1])+1
或者最好使用numpy方法:

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

首先,您的索引和范围已关闭。与大多数编程语言一样,python索引和范围以0开头,而范围是半开的(不包括最后一个值),因此在范围中需要考虑这一点

其次,numpy使用方括号进行索引,因此它应该是
f[s,x]
而不是
f(s,x)

第三,您可以像在MATLAB中一样在numpy数组中进行切片,但是您需要考虑索引的差异,并且对于
x:y:z
索引,在Python中最后一个元素是步长,而在MATLAB中中间元素是步长

第四,缩进在Python中非常重要,因此您的内部循环需要缩进一个级别,才能像在MATLAB中一样工作

至于您关于最后一行的问题,在numpy中没有一个函数同时处理max value和max index。您需要对值使用
np.max
,对索引使用
np.argmax
,如下所示:

fstar[s, n-1] = np.max(f[s, :M-s+1])
policy[s, n-1] = np.argmax(f[s, :M-s+1])+1
或者最好使用numpy方法:

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

您是否对矩阵等使用
numpy
。?您的
zeros()
呼叫表明您是。如果您是,那么您应该能够编写与MATLAB版本非常相似的代码,除了您使用
[]
而不是
()
索引矩阵,并且Python使用基于0的索引而不是基于1的索引。您是否使用
numpy
索引矩阵等。?您的
zeros()
呼叫表明您是。如果是,那么您应该能够编写与MATLAB版本非常相似的代码,除了使用
[]
而不是
()
索引矩阵,并且Python使用基于0的索引而不是基于1的索引