Випадкова хода по краях куба


35

Мурашка поміщена в кут куба і не може рухатися. Павук починається з протилежного кута і може рухатися по краях куба в будь-якому напрямку з однаковою ймовірністю . У середньому, скільки кроків знадобиться павукові, щоб дістатися до мурашки?(x,y,z)1/3

(Це не домашнє завдання, це питання інтерв'ю.)


7
Домашнє завдання? Що ви пробували поки що?
Адріан

Що стосується ланцюгів Markov, то тут чудовий вступ setosa.io/blog/2014/07/26/markov-chains
DL Dahly

1
Зазвичай цей вид звичайних книжкових робіт повинен бути позначений self-studyтегом та дотримуватися вказівок у його вікі-тегах . Будь ласка, відредагуйте це питання та додайте його до майбутніх подібних питань
Glen_b -Встановіть Моніку

4
@GarethMcCaughan - Ні, це не було питання про інтерв'ю.
Елізабет Сьюзен Джозеф

Після @alesc я зробив JavaScript Plunker. plnkr.co/edit/jYQVDI
abbaf33f

Відповіді:


32

Я пропоную моделювати проблему як ланцюг Маркова, де кожен стан представляє відстань між павуком та мурашкою. У цьому випадку у нас є 4 можливі стани оскільки відстані, які можу бути . i { 0 , 1 , 2 , 3 }Sii{0,1,2,3}

Коли павук знаходиться в протилежному куті куба, він знаходиться на відстані 3 кроки від мурашки. Він знаходиться в стані .S3

Побудова матриці переходу .P

  • Якщо ми намалюємо кубик, ми побачимо, що коли ми перебуваємо у стані , кожен рух зменшує відстань між павуком та мурашкою до 2 кроків. Отже, коли ми перебуваємо у стані ми переходимо до стану з ймовірністю 1.S 3 S 2S3S3S2

  • Коли ми перебуваємо в стані , ми можемо повернутися до стану використовуючи край, який ми прибули звідти, або ми можемо зменшити відстань лише до одного кроку, якщо вибрати два інші краї. Отже, коли ми перебуваємо у стані ми можемо перейти до стану з ймовірністю 2/3 та до стану з вірогідністю 1/3.S 3 S 2 S 1 S 3S2S3S2S1S3

  • Коли ми перебуваємо у стані , ми можемо перейти до стану використовуючи один з трьох можливих ребер. Якщо ми використовуємо інші два, ми повернемося до стану . Отже, коли ми перебуваємо у стані ми можемо перейти до стану з вірогідністю 1/3 та до стану з ймовірністю 2/3.S 0 S 2 S 1 S 0 S 2S1S0S2S1S0S2

  • Коли ми до штату , ми залишаємось там, оскільки це наша мета. - поглинаючий стан.S 0S0S0

P=[PS3S3PS3S2PS3S1PS3S0PS2S3PS2S2PS2S1PS2S0PS1S3PS1S2PS1S1PS1S0PS0S3PS0S2PS0S1PS0S0]=[01001/302/3002/301/30001]

Це поглинаюча ланцюг Маркова з трьома перехідними станами ( , , ) та одним поглинаючим станом ( ).S 2 S 1 S 0S3S2S1S0

Згідно з теорією, матрицю переходу ланцюга Маркова з перехідними станами та поглинаючими станами можна переписати як: r P = [ Q t R 0 r × t I r ]tr

P=[QtR0r×tIr]

де - матриця яка показує ймовірність переходу з деякого перехідного стану в інший перехідний стан, тоді як - матриця з ймовірністю переходу з одного з перехідних станів до одного з поглинаючих станів. Матриця тотожності показує нам, що коли досягається будь-який з поглинаючого стану, немає переходу від цього стану. Матриця всіх нулів може бути інтерпретована так, що немає переходу від жодного з поглинаючих станів до будь-якого з t×t R t×rtr I r r 0 r × t rtQtt×tRt×rtrIrr0r×trt перехідні стани.

введення представляє ймовірність переходу зі стану в стані точно в одному кроці. Щоб отримати можливість ступає нам потрібно введення . Підсумовуючи всі , ми отримуємо матрицю, яка містить у своєму записі очікувану кількість відвідувань перехідного стану після початку з перехідного стану .Q t i j k ( i , j ) Q k t k ( i , j ) j i(i,j)Qtijk(i,j)Qtkk(i,j)ji

k=0Qtk=(ItQt)1

Щоб отримати кількість кроків до поглинання, просто підсумуйте значення кожного рядка . Це можна представити за допомогою(ItQt)1

t=(ItQt)11

де - вектор стовпця з усіма компонентами, рівними 1.1

Давайте застосуємо це до нашої справи:

Як було сказано вище, у нашому випадку ми маємо = 3 перехідних стану та = 1 поглинаючий стан, тому: г Q т = [ 0 1 0 1 / 3 0 2 / 3 0 2 / 3 0 ]tr

Qt=[0101/302/302/30]R=[001/3]

Матриця з очікуваною кількістю відвідувань -

(ItQt)1=[2.54.531.54.53133]

Цю матрицю можна інтерпретувати так. Починаючи з стану і перш ніж поглинатися в ми відвідуємо в середньому 2,5 рази, 4,5 рази і 3 рази.S 0 S 3 S 2 S 1S3S0S3S2S1

Очікувана кількість кроків від стану до стану задається першим компонентом наступного вектора:S 0S3S0

t=[2.54.531.54.53133][111]=[1097].

Другий та третій компоненти - очікувана кількість кроків до якщо ми починаємо відповідно з та .S 0 S 2 S 1tS0S2S1


Я поняття не маю, що таке mcmc. Я повинен її прочитати, а потім перевірити ваше рішення. Чи є якесь хороше пояснення mcmc, яке компліментує ваше рішення?
Елізабет Сьюзен Джозеф

10
@ElizabethSusanJoseph Зауважте, що ланцюги Маркова та MCMC (ланцюг Маркова Монте-Карло) - це дві різні концепції (хоча MCMC заснований на ланцюгах Маркова). Ця відповідь не використовує MCMC ні для чого. Тож ви, мабуть, шукаєте гарне пояснення щодо ланцюгів Маркова, а не про MCMC.
Juho Kokkala

tiagotvv ваше пояснення було б вдосконалено шляхом визначення та пояснення використання матриці переходу P , значення величини r та висоти вектора стовпця. Бонусні бали за значення наступних елементів вектора t . :)
Олексій

@JuhoKokkala - дякую, я потім перегляну пояснення ланцюга Маркова.
Елізабет Сьюзен Джозеф

@ Алексис Я додав пояснення щодо матриць та векторів.
tiagotvv

21

Нехай - кількість очікуваних кроків. Нехай - кількість очікуваних кроків з будь-якого кута, що примикає до походження павука, і ditto для мурашки.xx 0x1x0

Тоді і . Оскільки x 0 = 1 + 2x=1+x1x1=1+2x0=1+23x1

x1=1+23x0+13x=1+23x0+13+13x1

ми отримаємо, що . Отже маючи на увазі, що і .x 0 = 1 + 2x1=x0+2 x0=7x1=9x0=1+23x0+43x0=7x1=9

Ми отримуємо свою відповідь як .x=10

Редагувати:

Якщо ми намалюємо куб з координатами то - вихідне положення павука, а - положення мурашки.111 000(x,y,z)111000

Павук може переходити на , або .101 110011101110

За симетрією куба вони повинні мати однакову кількість очікуваних кроків до мурашки, позначених . З ми можемо повернутися до початкового (з вірогідністю ) або (з ймовірністю ) можемо перейти до однієї з точок , , залежно від того, в якому стані ми перебуваємо.х 1 1 / 3 2 / 3 001 100 010x1x11/32/3001100010

Знову ж таки, за симетрією ці точки матимуть таку ж кількість очікуваних кроків, які ми називаємо . З цих позицій ми можемо досягти мети в одному кроці з ймовірністю або повернутися до одного з -positions з ймовірністю . Це означає, що . 1 / 3 х 1 2 / 3 х 0 = 1x01/3x12/3x0=131+23(1+x1)=1+23x1


Чи можете ви детальніше розробити свою відповідь? Поясніть, будь ласка, непростою мовою :)
Елізабет Сьюзен, Джозеф

17

Одна приємна абстракція про це думати:

Подумайте про положення Мурашки як та Павука , тепер кожен хід, який може зробити павук, по суті, переключиться саме на один із трьох компонентів з або . Тож стає питання:( 1 , 1 , 1 ) 1 0 0 1(0,0,0)(1,1,1)1001

If I randomly switch bits in (1,1,1) after how many steps in average do I get 0,0,0

Ми бачимо, найкоротший шлях - 3 вимикачі. Оскільки не важливо, з якого біта я починаю, ймовірність того, що відбувається 1 * 2/3 * 1/3 = 2/9. Якщо ми зробимо 1 помилку (переключимо один біт назад на 1), нам знадобиться 5 кроків. І шанси помилитися - 7/9 - якщо ми хочемо зробити лише одну помилку, ми повинні повернутися звідти назад і зробити все правильно знову - так що шанс зробити рівно 1 помилку, що призведе до 5 кроків, є 7/9 * 2/9і шанс допущення 2 помилок, а також 7 кроків (7/9)² * 2/9тощо.

Тож формула очікуваної середньої кількості кроків така:

E(steps)=n=0(3+2n)29(79)n=10

Ваше рішення дещо заплутало. Що це за формула? що тут російського?
Елізабет Сьюзен Джозеф

5
Це насправді найкоротше і найчистіше рішення. Рішення у вигляді нескінченної суми чисел від нуля до нескінченності і nє поточним цілим числом у цій нескінченній сумі.
алеск

Це справді приємно! Моя відповідь аналогічна, але розбиває послідовність перемикань на пари - це дозволяє мені очікувати геометричну змінну (або, як підсумок, підсумовувати геометричний ряд), а не підсумовувати арифметико-геометричний ряд . Це єдина суттєва відмінність: не важливо, чи потрібно брати "спочатку три перемикачі, потім наступні пари" (як ви це зробили) або "перший перемикач, потім наступні пари" (як я це зробив), оскільки якщо муха не спіймана в 3 перемикачі, то в будь-якому випадку ви маєте справу з одним непарним і двома парними паритетами.
Срібна рибка

16

Просто на комплімент у відповідь Тіаготвв:

Я звичайно не вважаю подібні проблеми матрицями (навіть якщо вони є). Я повинен намалювати це, що я зробив нижче. Ви можете бачити, що є три місця для переміщення з S, усі вони - як As. З будь-якого A ви можете або повернутися до S, або перейти до одного з двох B. З будь-якого B ви можете перейти до Е, або до однієї з двох As. Це все перекладається на матрицю переходу, задану tiagotvv, яку також можна намалювати у вигляді графіка.

введіть тут опис зображення

Оскільки я страшний у математиці, я б просто спробував імітувати вашу проблему. Це можна зробити за допомогою пакету markovchain в Р.

  library(markovchain)
  library(ggplot2)

  # Create a markovchain object, given the states and their transition matrix

  mcCube <- new("markovchain", 
                states = c("S", "A", "B", "E"),
                transitionMatrix = matrix(data = c(0,   1,   0,   0,
                                                   1/3, 0,   2/3, 0,
                                                   0,   2/3, 0,   1/3,
                                                   0,   0,   0,   1), 
                                          byrow = T, nrow = 4),
                name = "cube")

  # The following code calcuates the probability of landing on E after taking
  # between 1 and 100 steps from the start, given the above set of transition
  # probabilities.

  start <- c(1, 0, 0, 0)

  list <- list()

  for (i in 1:100){

    list[[i]] <- (start * mcCube^i)[4] 

  }

   a <- do.call(rbind, list)

   data <- data.frame(propE = a, 
                      steps = c(1:100))

   ggplot(data, aes(x = steps, y = propE)) +
    geom_line(size = 1) +
    ylab("Probability you reached the spider") +
    xlab("Number of steps taken") +
    theme_bw() +
    theme(panel.grid.minor = element_blank())

введіть тут опис зображення

  # This code simulates 1000 different applications of the markov chain where you 
  # take 1000 steps, and records the step at which you landed on E

  list <- list()
  for (i in 1:1000) {


    b <- rmarkovchain(n = 1000, object = mcCube, t0 = "S", include.t0 = T)

    list[[i]] <- 1001 - length(b[b == "E"])

  }

  data <- as.data.frame(do.call(rbind, list))

  ggplot(data, aes(x = V1)) +
    geom_density(fill = "grey50", alpha = 0.5) +
    geom_vline(aes(xintercept = mean(V1))) +
    ylab("Density") +
    xlab("Number of steps to reach E") +
    theme_bw() +
    theme(panel.grid.minor = element_blank())

  mean(data$V1)  # ~10 is the average number of steps to reach E in this set of
                 # simulations

введіть тут опис зображення

відповідь tiagotvv можна обчислити в R як:

q = matrix(c(0,   1,   0,   
             1/3, 0,   2/3, 
             0,   2/3, 0), byrow = T, nrow = 3)


(solve(diag(3) - q) %*% c(1, 1, 1))[1] # = 10

11

Роздуми про паритет дають дуже чітке рішення, використовуючи напрочуд просту техніку: ні ланцюги Маркова, ні ітераційні очікування, а лише підсумки рівня середньої школи. Основна ідея полягає в тому, що якщо павук рухається рівною кількістю разів у напрямку , він повернувся до початкової координати тому не може бути на місці мурашки. Якщо він перемістився непарної кількості разів у напрямку , то його координата збігається з мурашкою. Тільки якщо він перемістився непарної кількості разів у всіх трьох напрямках, він відповідатиме координатам , та мурашки.x x x x y y zxxxxxyz

Спочатку павук зробив нульові рухи в будь-якому з трьох напрямків, тому паритет для кожного напрямку є рівним. Всі три паритети потрібно перевернути, щоб дістатися до мурашки.

Після першого руху павука (позначимо цей напрямок ), рівно один напрямок має непарний паритет, а два інші ( і ) - парні. Щоб зловити мурашника, потрібно змінити лише ці два паритети. Оскільки цього неможливо досягти за непарною кількістю наступних кроків, відтепер ми розглянемо пари кроків. Існує дев'ять можливих комбінацій для першого парного руху:y zxyz

(x,x),(x,y),(x,z),(y,x),(y,y),(y,z),(z,x),(z,y),or(z,z)

Нам потрібно рухатись у напрямку і щоб дістатися до мурашки після одного парного руху, і дві з дев'яти комбінацій досягнуть цього: та забезпечать непарність усіх трьох паритетів.yz(y,z)(z,y)

Інші сім комбінацій залишають один непарний і два парні парності. Три повторні рухи , або залишають всі паритети незмінними, тому нам ще потрібно один рух і один щоб дістатися до мурашки. Інші пари містять два чіткі ходи, включаючи один у напрямку . Це перемикає паритет і один з інших паритетів (або або ), тому нам залишається одна непарна і дві парні. Наприклад, пара залишає нам потрібні ще один і ще один(x,x)(y,y)(z,z)yzxxyz(x,z)xyдістатися до мурашки: рівнозначна ситуація (після відновлення осей) до того, де ми були раніше. Потім ми можемо проаналізувати наступний парний крок таким же чином.

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

Нехай - кількість парних рухів, необхідних для досягнення мурашки. Ясно, що слід за геометричним розподілом на опорі з ймовірністю успіху так що має значення . Нехай - загальна кількість необхідних рухів, включаючи початковий хід і наступні парні ходи. Тоді таким чином, застосовуючи лінійність очікувань, .MM{1,2,3,}p=29E(M)=p1=92=4.5NMN=2M+1E(N)=2E(M)+1=2×4.5+1=10

Як варіант, ви можете відзначити і застосувати відому формулу до середнього значення дискретного розподілу, приймаючи лише невід'ємні цілі числа , . Це дає що є геометричним рядом з першим членом і загальним співвідношення так є сума . Тоді ми можемо прийняти як раніше.P(Mm)=(79)m1E(M)=m=1P(Mm)E(M)=m=1(79)m1a=1r=79 a1r=117/9=12/9=92E(N)

Порівняння ланцюгових рішень Маркова

Як я міг це помітити з матриці переходу ланцюга Маркова? Використовуючи позначення @ DLDahly, стани в матриці переходу відповідають моєму опису числа числа напрямків з непарним паритетом.

Мураха на павука в кубі

Етапна матриця переходу є

P=[PSSPSAPSBPSEPASPAAPABPAEPBSPBAPBBPBEPESPEAPEBPEE]=[01001/302/3002/301/30001]

Перший ряд показує нам, що після одного руху павук гарантовано перебуває у стані A (одна непарна і дві парні парності). Двоетапна перехідна матриця:

P(2)=P2=[1/302/3007/902/92/904/91/30001]

Другий ряд показує нам, що після того, як павук перейшов у стан А, за два рухи час він або повернувся до стану А з вірогідністю або досяг стану Е (всі непарні паритети) і захопив мурашника, з ймовірністю . Отже, дійшовши до стану A, ми бачимо з двошагової матриці переходу, що кількість необхідних двоетапних ходів можна проаналізувати, використовуючи геометричний розподіл, як зазначено вище. Це не так, як я знайшов своє рішення, але іноді варто обчислити перші кілька потужностей перехідної матриці, щоб побачити, чи можна використовувати такий корисний візерунок. Іноді я вважаю, що це дає простіші рішення, ніж інвертувати матрицю або виконувати ейджендекомпозицію вручну - правда, те, що є дійсно актуальним лише в ситуації з іспитом чи співбесідою.2 / 97/92/9


2

Я написав коротку програму Java, щоб відповісти на ваше запитання чисельно. Переміщення павука справді випадкове, це означає, що він також може переходити циклами, перш ніж дістатися до мурашки.

Однак ви не визначили термін "протилежний кут", тому у мене є два різні сценарії. Навпроти, як в одній площині, так і поперек куба. У першому сценарії найкоротший шлях - 2 кроки, а у другому - 3 кроки.

Я використовував 100 мільйонів повторів, і результати такі:

-- First scenario --
Steps sum: 900019866
Repeats: 100000000
Avg. step count: 9.00019866

-- Second scenario --
Steps sum: 1000000836
Repeats: 100000000
Avg. step count: 10.00000836

Вихідний код:

import java.util.Random;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.IntStream;

public class ProbabilityQuizSpider {

    // Edges of the cube
    private static final int[][] EDGES = new int[][] {
            {1, 3, 7}, // corner 0
            {0, 2, 4}, // corner 1
            {1, 3, 5}, // corner 2
            {0, 2, 6}, // corner 3
            {1, 5, 7}, // corner 4
            {2, 4, 6}, // corner 5
            {3, 5, 7}, // corner 6
            {0, 4, 6}  // corner 7
    };

    private static final int START = 0; // Spider
    private static final int FINISH = 5; // Ant
    private static final int REPEATS = (int) Math.pow(10, 8);

    public static void main(String[] args) {

        final Random r = new Random();
        final AtomicLong stepsSum = new AtomicLong();

        IntStream.range(0, REPEATS).parallel().forEach(i -> {

            int currentPoint = START;
            int steps = 0;

            do {

                // Randomly traverse to next point
                currentPoint = EDGES[currentPoint][r.nextInt(3)];

                // Increase number of steps
                steps++;

            } while(currentPoint != FINISH);

            stepsSum.addAndGet(steps);

        });

        // Results
        System.out.println("Steps sum: " + stepsSum.get());
        System.out.println("Repeats: " + REPEATS);
        System.out.println("Avg. step count: " + (((double) stepsSum.get()) / ((double) REPEATS)));

    }

}

EDIT: виправлено помилку в сценарії (а також оновлено результати)


2
Я думаю, що ваші краї неправильні. Куточок 3 має 7 у своєму списку, а кутовий 7 у своєму списку не має 3. (Я вважаю , що правильний шлях до карти вершини з номерами 0..7 повинен сказати , що кожен біт позиція відповідає одній осі, так що перетинаючи край одно XOR з 1, 2 або 4)
Gareth McCaughan

1
Дякую за коментар Я зробив друкарську помилку, визначаючи куточок №3, він повинен бути {0, 2, 6}. Я повторно запустив програму і отримав наступний результат: 10.00000836 кроки для переходу від кута № 0 до кута №5 (діагональ куба тіла). Це також відповідає @Hunaphu.
alesc

Так, набагато краще.
Гарет Маккоган,

2

Я вирішив вашу головоломку за допомогою симуляцій Монте-Карло ( ) і отримав .m e a n ( s t e p sn=104mean(steps)10

Моделювання в Монте-Карло ($ n = 10 ^ 4 $)

Ось код R, який я використав:

ant = c(0,0,0) # ant's coordinates 

sim = 1e4 # number of MC simulations
steps = numeric() # initialize array of steps

for (i in 1:sim)
{
  spider = c(1,1,1) # spider's coordinates
  count = 0 # initialize step counter

  # while ant's coordinates == spider's coordinates
  while (!isTRUE(all.equal(ant, spider)))
  {

  # random walk in one of three dimensions
  xyz = trunc(runif(1,1,4))

  # let the spider move
  if (spider[xyz] == 1) 
    {
    spider[xyz] = 0
    } else if (spider[xyz] == 0) 
    {
    spider[xyz] = 1
    }

  # add one step
  count = count + 1
  }

# add the number of step occurred in the ith iteration
steps = c(steps, count)

# print i and number of steps occurred
cat("\n", i, " ::: ", count)
}

# print the mean of steps
(mean(steps))

9
Код приємний і зрозумілий - але він вимагає від багатьох користувачів переглядати мільйон рядків, роздрукованих протягом півгодини! І як ви знаєте, що правильна відповідь не є, скажімо, ? :-) FWIW, ви можете використовувати деякі нативні функції, щоб прискорити це до секунди:10.000001Rn.sim <- 1e6; x <- matrix(runif(n.sim*3), ncol=3); moves <- x >= pmax(x[, 1], x[, 2], x[, 3]); positions <- apply(moves, 2, cumsum) %% 2; types <- rowSums(positions); vertices <- types[types==0 | types==3]; transitions <- cumsum(diff(vertices) != 0); n.sim / transitions[length(transitions)]
whuber

-1

Я вважаю, що Алеск стоїть на правильному шляху, коли згадуєш "Однак ти не визначив термін" протилежний кут ", якщо я щось не пропускаю у запитанні, немає правильної відповіді, лише відповіді на основі припущень. Розмір куба не визначений IE 10 кубічних футів, 1000 кубічних футів тощо. Розмір мурашів не визначений IE маленький сад, тесляр, гігантський червоний тощо, тип павука не визначений (для визначення розміру кроку) IE маленький сад, Тарантула тощо. Якщо ви поєднуєте все "не визначено "змінні. Відповідь може бути 0 кроків або невизначена / нескінченна кількість кроків.


3
Ця відповідь не перейшла б на наступний рівень опитування, якщо б це не було місце для садівництва.
whuber

1
У цьому випадку досить зрозуміло, що "крок" означає "перехід від одного вузла (кута) до сусіднього вузла", і цілком зрозуміло, що означає "протилежний кут" куба - візьмемо, наприклад, одиничний куб - якщо мураха знаходиться в куті (x, y, z) на одиничному кубі, павук знаходиться в (1-x, 1-y, 1-z) (так що, якщо мурашка у походження, павук знаходиться в (1,1 , 1)). Таким чином, жодне ваше занепокоєння, здається, не стосується суттєво поставленого питання. [Примітка для виборців: Хоча я не вважаю, що це хороша відповідь без змістовної редагування, я не думаю, що це повинно бути предметом голосування про видалення - голосів "за" і "вниз" недостатньо]
Glen_b -Встановити Моніку

@Glen_b Оскільки, мабуть, шукають ясності деталі запитання, я вважав, що це, мабуть, передбачалося як коментар, а не змістовна відповідь.
Срібна рибка

1
@Silverfish Ви можете бути прав, але тоді це закриється як "не відповідь". Я читав це натомість як спробу сказати "це питання не відповідає", що, як правило, розглядаю як відповідь, коли його підтримують міркуваннями, але я думаю, що причини просто базуються на нерозумінні питання.
Glen_b -Встановіть Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.