Как смоделировать проблему процесса мартингейла в R?

#r #random #simulation

Вопрос:

100 человек смотрят театр.В конце шоу все они посещают раздевалку, чтобы взять свои пальто.Человек, работающий в раздевалке, отдает пальто людям совершенно случайным образом.Участники, которым они подберут подходящее пальто, уходят.Другой, который выбрал не того, вернет пальто, и мужчина снова случайным образом вернет пальто.Процесс заканчивается, когда все посетители театра забирают свое правое пальто.

Я хочу смоделировать в R этот процесс мартингейла, чтобы определить ожидаемое время окончания этого процесса. Но я не знаю, как это сделать .Какая-нибудь помощь ? Что-то вроде:

 

# 100 customers
x = seq(1,100,by=1);x
# random sample from x 
y = sample(x,100,replace=FALSE)
x==y
# for the next iteration exclude those how are TRUE and run it again until everyone is TRUE


 

Ожидаемое время-это количество итераций там, где это необходимо .

Или что-то в этом роде :

 
n = 100
X = seq(1,100,by=1)
martingale = rep(NA,n)

iterations = 0
accept     = 0
while (X != n) {
  iterations =  iterations   1
  y = sample(1:100,100,replace=FALSE)
  if (X = y){ 
    accept = accept   1
    X = X 1
    martingale [X] = y
  }
}
accept
iterations

 

Комментарии:

1. Ярчайший, но не обязательно самым эффективным решением этой проблемы будет связана с выполнением while петли для имитации процесса; каждый раз через петлю, образца нынешнего потребителя и современные пальто и используйте if заявление, чтобы обновить список клиентов и пальто соответственно (их оставляем без изменений, если не совпадают, в противном случае удалить клиента из списка/вектора клиентам и пальто из списка/вектора пальто)

2. Хорошо, решение, которое вы только что добавили, выглядит разумным. Это работает? Если нет, то что это делает?

3. @BenBolker нет, конечно, это не работает. Я сделал это просто как псевдо-код. Но ваше описание выглядит лучше. До сих пор я не знаю, как это сделать.

4. @BenBolker вы говорите, что будет два вектора: а) клиенты и б)пальто. И каждый раз я должен исключать совпадение из обоих векторов. Процесс закончится, когда оба вектора будут пустыми. Верно? Я думал о том, чтобы иметь один вектор и удалять каждое итеративное совпадение. Но я не знаю, прав ли я.

5. Да, я думаю, вы могли бы сделать это с помощью одного вектора. Вы бы взяли два образца i и j из того вектора, который остался, независимо друг от друга; если i == j бы тогда remaining <- remaining[-i] .

Ответ №1:

Один из способов сделать это заключается в следующем (используя 10 человек в качестве примера, оператор печати не нужен, просто чтобы показать, что делается на каждой итерации):

 set.seed(0)
x <- 1:10
count <- 0
while(length(x) > 0){
  x <- x[x != sample(x)]
  print(x)
  count <- count   1
}

# [1]  1  2  3  4  5  6  7  9 10
# [1] 3 4 5 6 7 9
# [1] 3 4 5 6 7
# [1] 3 4 5 6 7
# [1] 3 4 5 6 7
# [1] 3 4 5 6 7
# [1] 3 4 5 6 7
# [1] 3 4 5 6 7
# [1] 3 6
# 
count
# [1] 10
 

Для каждого шага цикла он удаляет значения x, в которых клиенты были случайным образом распределены по своему пальто, до тех пор, пока их не останется.

Чтобы использовать этот код для получения ожидаемого времени, затраченного на 100 человек, вы можете расширить его до:

 set.seed(0)
nits <- 1000 #simulate the problem 1000 times
count <- 0
for (i in 1:nits){
  x <- 1:100
  while(length(x) > 0){
    x <- x[x != sample(x)]
    count <- count   1/nits
  } 
}
count
# [1] 99.901
 

Я выдвигаю гипотезу без доказательств, что ожидаемое время для n человек — это n итераций-это кажется довольно близким, когда я пробовал с 50, 100 или 200 людьми.

Комментарии:

1. Очень полезный,простой и содержательный код, но один вопрос. С 3 — й по 9 — ю итерацию он не нашел совпадения. Потому что 3,4,5,6,7 остаются без совпадения.

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

Ответ №2:

Я не следил за вашим обсуждением выше, и я не совсем уверен, что вы этого хотите, но мое обоснование было следующим:

  • У вас есть N человек, и вы ставите их в очередь.
  • В первом раунде у первого человека есть шанс 1/N правильно одеться.
  • На данный момент у вас есть два варианта. Либо человек 1 правильно одевается, либо нет.
  • Если человек 1 правильно оденется, то у человека 2 есть шанс 1/(N-1) правильно одеться. Если человек 1 не получил правильную одежду, человек 1 остается в бассейне (в конце), и у человека 2 также есть вероятность 1/N, чтобы правильно одеться.
  • Вы продолжаете назначать эти вероятности до тех пор, пока все N человек не увидят клерка один раз. Затем вы сортируете тех, у кого есть правильная одежда, и повторяете шаг 1, пока у всех не будет подходящей одежды.
  • Для целей моделирования вы, конечно, повторили бы все это 1000 или 10000 раз.

Если я вас правильно понимаю, вас интересует количество итераций, т. Е. Как часто клерку приходится проходить всю очередь (или то, что от нее осталось), пока все не получат свою одежду.

библиотека(tidyverse)

 people <- 100
results <- data.frame(people     = 1:people,
                      iterations = NA)

counter <- 0
finished <- 0

while (finished < people)
{
  loop_people <- results %>%
    filter(is.na(iterations)) %>%
    pull(people)

  loop_prob <- 1/length(loop_people)
  loop_correct <- 0

  for (i in 1:length(loop_people))
  {
    correct_clothes_i <- sample(c(0,1), size = 1, prob = c(1-loop_prob, loop_prob))
    if (correct_clothes_i == 1)
    {
      results[loop_people[i], 2] <- counter   1
      loop_correct <- loop_correct   1
      loop_prob <- 1/(length(loop_people) - loop_correct)
    }
  }
  counter <- counter   1
  finished <- length(which(!is.na(results$iterations)))
}

max(results$iterations)

[1] 86

head(results)

  people iterations
1      1          7
2      2         42
3      3         86
4      4         67
5      5          2
6      6          9
 

results$iterations Столбец содержит номер итерации, в которой каждый человек правильно оделся, таким образом max(results$iterations) , вы получите общее количество циклов.

У меня нет доказательств, но эмпирически и интуитивно количество требуемых итераций должно приближаться к N.

Комментарии:

1. Они не стоят в очереди. Всего их N=100 вместе взятых. После первого совпадения останется, скажем, 97. И так далее… Вопрос в том, сколько раз клерк случайным образом делил пальто, пока все не получили нужное.

2. Но продавец случайно выбирает какую-то одежду, верно? а потом он показывает это одному человеку за раз. Если бы клерк показал это ВСЕМ людям одновременно, то у вас есть вероятность 1, что в первой итерации кто-то выбрал бы правильную одежду. Во второй итерации у вас снова будет вероятность 1. Но тогда у вас есть ровно N итераций, но я не думаю, что это то, чего вы хотите?

3. Нет. Я прошу прощения за путаницу. Просто раздает случайные пальто случайным людям. Если есть совпадение, они уходят. И процесс продолжается с оставшимися клиентами.

4. в этом случае решение от @Miff кажется правильным. Но теоретические результаты остались прежними. В долгосрочной перспективе вам понадобится N итераций, пока все не получат правильную одежду.