产品销售总额最大化场景的高效动态规划实现思路咨询
动态规划实现思路指导
第一步:明确DP状态定义
你原来的框架缺少一个核心状态变量:上一阶段结束后的价格参数P,因为P的计算和前序所有投放量直接相关,是转移逻辑的必要输入。完整的状态定义如下:
dp[t][rem][p]:表示第t个时段开始时,剩余库存为rem,上一阶段结束后的价格参数为p时,后续所有时段能拿到的最大实际总销量。- 边界条件:当
t == T(所有时段全部结束),不管剩余多少库存,总销量都为0,即dp[T][*][*] = 0。
第二步:状态转移逻辑
对于每个状态(t, rem, p),枚举当前时段的投放量sell(取值范围0 ≤ sell ≤ rem):
- 计算当前时段更新后的价格参数:
new_p = ceil(0.5 * (p + sell)) - 计算当前时段的实际销量:
s_now = ceil((1 - alpha * (new_p ** pi)) * sell) - 后续时段的最大销量直接取已经计算好的
dp[t+1][rem - sell][new_p] - 当前状态的最大值为所有
sell对应的s_now + 后续最大销量的最大值。
第三步:空间优化说明
因为计算第t层状态时只需要用到t+1层的结果,你可以只用两个二维数组(当前层、下一层)存储状态,不需要存储完整的三维数组,能大幅节省内存。
另外P的最大可能值不会超过总库存N,所以P的状态范围限定为0 ≤ p ≤ N即可,不需要额外开辟更大的空间。
完整可运行DP实现代码
import math import numpy as np def max_sales_dp(N, T, alpha, pi): # next_dp[剩余库存][前序P值] = 后续时段最大实际总销量 # 初始为t=T的边界状态:所有值为0 next_dp = np.zeros((N+1, N+1), dtype=np.int32) # 倒序遍历所有时段,从最后一个时段往前推 for t in range(T-1, -1, -1): cur_dp = np.zeros((N+1, N+1), dtype=np.int32) # 遍历所有可能的剩余库存 for rem in range(N+1): # 遍历所有可能的前序P值 for prev_p in range(N+1): best = 0 # 枚举当前时段的所有可能投放量 for sell in range(0, rem+1): new_p = math.ceil(0.5 * (prev_p + sell)) s_now = math.ceil((1 - alpha * (new_p ** pi)) * sell) total = s_now + next_dp[rem - sell][new_p] if total > best: best = total cur_dp[rem][prev_p] = best next_dp = cur_dp # 初始状态为第0时段开始,剩余库存N,初始P=0 return next_dp[N][0] # 测试示例参数 if __name__ == "__main__": N = 1000 T = 10 pi = 0.5 alpha = 1e-2 print(f"最大实际总销量:{max_sales_dp(N, T, alpha, pi)}")
额外性能优化点
- 提前预处理所有
p对应的alpha * p**pi的值,避免重复计算,提升运行速度 - N较大时可以加剪枝逻辑:当剩余库存
rem较小时,sell的遍历范围可以同步缩小,不需要遍历到N
内容的提问来源于stack exchange,提问作者Cindy Philip
相关产品推荐
相关产品推荐

