首页 > 解决方案 > 通过计划时间表找到最大的产品销售额

问题描述

我正在研究一个动态规划问题,实际上,我不太确定它是否是动态规划,因为移动平均 M 是基于先前的 M。无需考虑效率。该问题需要在 T 个时间段内销售产品并最大化实际销售总额。产品总数为 N,我计划在不同时期销售一些产品 n0,n1,⋯,nT−1 和 ∑ni=N。

总之,这个问题想要找到 n0,n1,⋯,nT−1 的最优调度,使得 ∑ni=N,最大化 ∑Si。

实际销售额 Si 是基于当前移动平均 M 和当前 ni。假设 α=0.001 且 π=0.5

  1. 初始化 M=0。那么对于 i=0,1,…,T−1
  2. 计算新的 Mi=⌈0.5∗(Mi+ni)⌉</li>
  3. 在时间 i 我们出售 Si = ⌈(1−α*M^πi)*ni⌉ 产品

    继续这个过程直到最后一个时间段。例如,假设我们已经知道所有时期的 ni,交易将低于
    M = 0
    T = 4
    N = 10000
    alpha = 1e-3
    pi = 0.5
    S = np.zeros(T,dtype='i')
    n  = np.array([5000,1000,2000,2000])
    print(n)
    total = 0
    for i in range(T):
        M = math.ceil(0.5*(M + n[i]))
        S[i] = math.ceil((1 - alpha*M**pi)*n[i])
        total += S[i]
        print('at time %d, M = %d and we sell %d products' %(i,M,S[i]))
    print('total sold =', total)

我的想法是根据 t 时间段、剩余 n 个产品和 m 个移动平均值作为索引来跟踪状态,并将实际销售存储在一个高维矩阵中。我认为移动平均线的上限只是 [0,n] 我仍然对如何编程感到困惑。有人可以提供有关如何解决我的编程中的一些问题的想法吗?非常感谢。下面是我的一些粗略代码,但输出有点奇怪。

def DPtry(N,T,alpha,pi,S):
    schedule = np.zeros(T)
    M = 0
    
    for n in range(0,N+1):
        for m in range(0,n+1):
            S[T-1,n,m] = math.ceil((1 - alpha*m**pi)*n)
    
    for k in range(1,T):
        t = T - k - 1
        print("t = ",t)
        for n in range(0,N+1):
            for m in range(0,n+1):
                best = -1
                
                for plan in range(0,n+1):
                    salenow = math.ceil((1 - alpha*m**pi)*plan)
                    M = math.ceil(0.5*(m + plan))
                    salelater = S[t+1,n-plan,M]
                    candidate = salenow + salelater
                    if candidate > best:
                        best = candidate
                S[t,n,m] = best
                
    print(S[0,N,0])
N = 100
T = 5
pi = .5
alpha = 1e-3

S = np.zeros((T,N+1,N+1))
DPtry(N,T,alpha,pi,S)

标签: pythondynamic-programming

解决方案


推荐阅读