如何通过仿真获得/确定此模型中的最佳组合(s,S)?
using Distributions
function simulateOneRun(m, s, S)
pd = Poisson(20)
h, c = 0.1, 2.0 # storage cost & sale price
p = 0.50 # probability of delivery
K, k = 40.0, 1.0 # fixed and variable order cost
Xj, Yj = S, 0.0 # stock in the morning and in the evening
profit = 0.0 # cumulated profit.
for j in 1:m
Yj = Xj - rand(pd) # subtract demand for the day.
Yj < 0.0 && (Yj = 0.0) # lost demand.
profit += c * (Xj - Yj) - h * Yj
if Yj < s && rand()< p # we have a successful order.
profit -= K + k * (S - Yj)
Xj = S
else
Xj = Yj
end
end
profit / m
end
for S in [190.0, 200.0, 210.0]
println(S,"\t", @time simulateOneRun(10_000_000, 100.0, S))
end
我不知道如何确定这个函数的优化缓存。
答案 0 :(得分:1)
这个问题与仿真优化算法有关,与编程无关。关键的问题是什么是(s,S)
对的领域,因为它会影响算法。也许你可以看看例如在handbook处选择适合您情况的方法。此外,由于问题是随机的,因此请注意,只有在正确选择的可能性下才能找到解决方案(假设(s, S)
空间的基数很小,在连续空间中,基于PCS的推理不适用。)
为了减轻计算负担(代码中的m
较低),您可能需要使用一些减少方差的方法(例如,参见here),在这种情况下,对于每个随机性使用者,您的代码应该为随机数提供一个独立且可复制的流。这是一个示例,您可以如何修改代码以获取代码:
using Random
function simulateOneRun(m, s, S, seed1=1234, seed2=4321)
mt1 = MersenneTwister(seed1)
mt2 = MersenneTwister(seed2)
pd = Poisson(20)
h, c = 0.1, 2.0 # storage cost & sale price
p = 0.50 # probability of delivery
K, k = 40.0, 1.0 # fixed and variable order cost
Xj, Yj = S, 0.0 # stock in the morning and in the evening
profit = 0.0 # cumulated profit.
for j in 1:m
Yj = Xj - rand(mt1, pd) # subtract demand for the day.
Yj < 0.0 && (Yj = 0.0) # lost demand.
profit += c * (Xj - Yj) - h * Yj
if Yj < s && rand(mt2) < p # we have a successful order.
profit -= K + k * (S - Yj)
Xj = S
else
Xj = Yj
end
end
profit / m
end
您还可以考虑在类似demand = rand(pd, 10_000_000)
和success = rand(10_000_000) .< p
的向量中为需求和订单成功分配随机流,并将它们传递给simulateOneRun
。这应该加快步伐了一点,但收益可能不会很大。
这不是最终解决方案,因为您仍然需要修改代码以对稳态下的系统性能进行正确的评估(因为我想这是您的任务)。 This book是一个很好的参考。