Этот вопрос скорее относится к алгоритмам оптимизации моделирования, а не напрямую к программированию.Важнейшим вопросом является то, что является доменом пары (s,S)
, так как это повлияет на алгоритм.Возможно, вы можете взглянуть, например, на этот справочник , чтобы выбрать подход, подходящий для вашего случая.Кроме того, поскольку проблема является стохастической, обратите внимание, что решение будет найдено только с некоторой вероятностью правильного выбора (при условии, что пространство (s, S)
имеет небольшую мощность, в непрерывных пространствах рассуждения на основе PCS не применяются).
Чтобы уменьшить вычислительную нагрузку (ниже m
в вашем коде), вы, вероятно, захотите использовать некоторый подход уменьшения дисперсии (см., Например, здесь ), и в этом случае для каждого потребителя случайности в вашем кодеВы должны предоставить отдельный и воспроизводимый поток для случайных чисел.Вот пример того, как вы могли бы изменить свой код, чтобы получить его:
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
.Это должно немного ускорить его, но выигрыш, вероятно, не будет большим.
Это не окончательное решение, так как вам все еще нужно изменить код для правильной оценки производительности системы в стабильном режиме.состояние (как я думаю, это задание у вас есть). Эта книга является хорошим справочником.