Как получить / определить оптимальную комбинацию (и) в этой модели с помощью симуляции? - PullRequest
0 голосов
/ 02 февраля 2019

Как получить / определить оптимальные комбинации (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

Я не знаю, как определить оптимальное кэширование этой функции.

1 Ответ

0 голосов
/ 02 февраля 2019

Этот вопрос скорее относится к алгоритмам оптимизации моделирования, а не напрямую к программированию.Важнейшим вопросом является то, что является доменом пары (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.Это должно немного ускорить его, но выигрыш, вероятно, не будет большим.

Это не окончательное решение, так как вам все еще нужно изменить код для правильной оценки производительности системы в стабильном режиме.состояние (как я думаю, это задание у вас есть). Эта книга является хорошим справочником.

...