python - 通过计划时间表找到最大的产品销售额
问题描述
我正在研究一个动态规划问题,实际上,我不太确定它是否是动态规划,因为移动平均 M 是基于先前的 M。无需考虑效率。该问题需要在 T 个时间段内销售产品并最大化实际销售总额。产品总数为 N,我计划在不同时期销售一些产品 n0,n1,⋯,nT−1 和 ∑ni=N。
总之,这个问题想要找到 n0,n1,⋯,nT−1 的最优调度,使得 ∑ni=N,最大化 ∑Si。
实际销售额 Si 是基于当前移动平均 M 和当前 ni。假设 α=0.001 且 π=0.5
- 初始化 M=0。那么对于 i=0,1,…,T−1
- 计算新的 Mi=⌈0.5∗(Mi+ni)⌉</li>
- 在时间 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)
解决方案
推荐阅读
- python - 当 Django-Rest-Framework 收到请求时会发生什么?
- android - Kotlin 字段覆盖和 GSON 反序列化无法创建转换器类异常
- alibaba-cloud - 如何使用阿里巴巴中的 DistCp 工具增量迁移 HDFS 数据
- r - 如何根据条件覆盖 aes 颜色(由变量控制)?
- jquery - 在 Prestashop 1.7.5.0 中通过 Javascript (jQuery) 将产品添加到购物篮
- ruby - “您的 PATH 中没有 [PATH],gem 可执行文件将无法运行。” 使用“gem install --user-install bundler”时
- google-app-engine - 谷歌应用引擎:在此服务器上找不到 url/404 错误
- javascript - 我真的可以在上传表单中使用这段代码吗?
- r - 是否有一个 R 函数可以按列名的一部分创建子集?
- oracle - 如何在 PL/SQL Oracle 中使用 REF 类型?