我是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中写下最后一行?
答案 0 :(得分:0)
首先,您的索引和范围已关闭。与大多数编程语言一样,python索引和范围从0开始,范围是半开放的(它们排除了最后一个值),因此您需要在范围内考虑这一点。
其次,numpy使用方括号进行索引,因此f[s,x]
而不是f(s,x)
。
第三,你可以像在MATLAB中那样在numpy数组中进行切片,但是你需要考虑索引差异以及x:y:z
索引 last 元素的事实是Python中的步长,而在MATLAB中,中间元素是。
第四,缩进在Python中很重要,因此你的内部循环需要缩进一个级别,以便在MATLAB中工作。
至于关于最后一行最后一行的问题,numpy中没有单一函数可以处理最大值和最大索引。您需要使用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