Bir küpün kenarlarında rastgele yürüyüş


35

Bir karınca küpün bir köşesine yerleştirilir ve hareket edemez. Bir örümcek karşı köşeden başlar ve küpün kenarları boyunca eşit olasılıkta ile herhangi bir yönde hareket edebilir . Ortalama olarak, örümceğin karıncaya kaç adım atması gerekir?(x,y,z)1/3

(Bu ev ödevi değil, röportaj sorusu idi.)


7
Ev ödevi? Şimdiye kadar ne denedin?
Adrian,

Markov zincirleri ile ilgili olarak, burada harika bir intro setosa.io/blog/2014/07/26/markov-chains
DL Dahly

1
Normalde bu tür rutin kitap işleri self-studyetiketiyle işaretlenmeli ve wiki etiketindeki yönergeleri takip etmelidir . Lütfen bu soruyu düzenleyin ve gelecekteki benzer sorulara
ekleyin

4
@GarethMcCaughan - Hayır, bu bir röportaj sorusu idi.
Elizabeth Susan Joseph

@Alesc'in ardından bir JavaScript Plunker yaptım. plnkr.co/edit/jYQVDI
abbaf33f

Yanıtlar:


32

Problemi, her bir durumun örümcekle karınca arasındaki mesafeyi temsil ettiği bir Markov zinciri olarak modellemeyi öneririm. Bu durumda, 4 olasılık vardır mesafeli ı olabilir { 0 , 1 , 2 , 3 } .Sbenben{0,1,2,3}

Örümcek küpün zıt köşesindeyken, karıncaya 3 adım mesafede. Bu durum içinde .S3

Geçiş matrisi inşa .P

  • Biz biz devlet altındadır zaman görürüz küp çizerseniz , her hareketi örümcek ve 2 adımlarına karınca arasındaki mesafeyi azaltır. Böylece S 3 durumundayken , olasılık 1 ile S 2 durumuna geçiyoruz.S3S3S2

  • Devlet biz olduğunda , geri durumuna gidebilir S 3 oradan geldi kenarını kullanarak ya da biz diğer iki kenarı seçerseniz sadece bir adıma mesafeyi azaltabilir. Biz devlet altındadır Yani, S 2 devlet için biz hareket edebilir S 1 olasılık 2/3 ile ve devlete S 3 olasılık 1/3 ile.S2S3S2S1S3

  • Biz devlet altındadır zaman devlet için, gidebiliriz S 0 üç olası kenarları birini kullanarak. Diğer ikisini kullanırsak, S 2 durumuna geri döneriz . Böylece S 1 durumundayken 1/3 olasılıkla S 0 durumuna ve 2/3 olasılıkla S 2 durumuna geçebiliriz .S1S0S2S1S0S2

  • durumuna geldiğimizde, amacımız olduğundan dolayı orada kalacağız. S 0 emici bir durumdur.S0S0

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

Bu (üç geçiş durumlu bir emici Markov zinciri olduğu , S 2 , S 1 ) ve durum emici bir ( S 0 ).S3S2S1S0

Teoriye göre, bir Markov zincirinin geçiş matrisi geçici durumları ve r emici durumları gibi yazılabilir: P = [ Q t R 0 r x t ı r ]tr

P=[StR,0rxtbenr]

burada isimli bir T x t matris gösterir bu ise, bir geçici duruma bir geçiş durumdan geçiş olasılığı R, a, t x r, bir geçiş olasılıkları matris t birine geçici durumlarda r emici devletler. Birim matris I r herhangi zaman bu gösterir bize r emici durumuna ulaşıldığında, uzak bu durumdan bir geçiş vardır. Tamamen sıfırlı matris 0 r x t herhangi birinden herhangi bir geçiş olduğu şekilde yorumlanabilir rSttxtR,txrtrbenrr0rxtrherhangi durumları emici geçici durumları.t

giriş Q t bir durumdan diğerine geçiş olasılığını temsil eder ı bir durum için j tam olarak tek bir adımda. K basamağı olasılığını elde etmek için Q k t ( i , j ) girişine ihtiyacımız var . Herkes için Özetlersek k , biz onun içinde içeren bir matris olsun ( i , j ) girişine geçici devlet ziyaretleri beklenen dizi j geçici durumundan başladıktan sonra i .(ben,j)Stbenjk(ben,j)Stkk(ben,j)jben

Σk=0Stk=(bent-St)-1

Alınan adımların sayısını almak için, sadece her satırın satırının değerlerini toplayın . Bu tarafından temsil edilebilir(bent-St)-1

t=(bent-St)-11

buradaki , tüm bileşenlerin 1'e eşit olduğu bir sütun vektörüdür.1

Bunu davamıza uygulayalım:

Yukarıda belirtildiği gibi, bizim durumumuzda Elimizdeki 3, geçici durumları ve = r : bu yüzden, = 1 emici durum S t = [ 0 1 0 1 / 3 0 2 / 3 0 2 / 3 0 ]tr

St=[0101/302/302/30]R,=[001/3]

Beklenen ziyaret sayısına sahip matris

(bent-St)-1=[2.54.531.54.53133]

Bu matris aşağıdaki gibi yorumlanabilir. Devletten başlayarak ve en absorbe almadan önce S 0 , ortalama olarak, biz ziyaret S 3 2.5 kat, S 2 4.5 kat ve S 1 3 kez.S3S0S3S2S1

Durumdan adımları beklenen sayısı durum için S 0 , aşağıdaki vektör ilk bileşeni aşağıdaki şekilde verilir:S3S0

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

İkinci ve üçüncü parçalar adımları beklenen sayıda S 0 biz başlamak ise S 2 ve S 1 , sırasıyla.tS0S2S1


Mcmc'nin ne olduğu hakkında hiçbir fikrim yok. Okumalı ve sonra çözümünü kontrol etmeliyim. Çözümünüzü tamamlayan iyi bir mcmc açıklaması var mı?
Elizabeth Susan Joseph

10
@ElizabethSusanJoseph Markov zincirleri ve MCMC'nin (Markov zinciri Monte Carlo) iki farklı kavram olduğunu unutmayın (MCMC Markov zincirlerini temel almasına rağmen). Bu cevap MCMC'yi hiçbir şey için kullanmaz. Bu yüzden muhtemelen MCMC ile ilgili olarak Markov zincirleri hakkında iyi bir açıklama arıyorsunuz.
Juho Kokkala

tiagotvv için açıklama tanımlama ve geçiş matrisi kullanımını açıklayan gelişmiş olabilir P , miktar anlamını r ve kolon vektörü yüksekliği. Vektörün sonraki elemanlarının anlamı için bonus puanları t . :)
Alexis,

@JuhoKokkala - teşekkürler markov zinciri açıklamalarına bakacağım.
Elizabeth Susan Joseph

@Alexis Matrisler ve vektörlerle ilgili bazı açıklamalar ekledim.
tiagotvv

21

Let beklenen adımların sayı. Let x 1 örümceğin Kalkış ve bitişik herhangi bir köşesinden beklenen adım sayısı, X 0 ant için aynı şeyler.xx1x0

Sonra ve x 0 = 1 + 2x=1+x1. X1=1+2’denberi x0=1+23x1

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

o olsun . Öyleyse x 0 = 1 + 2x1=x0+2 ,x0=7vex1=9 olduğu anlamına gelir.x0=1+23x0+43x0=7x1=9

Cevabımızı olarak alıyoruz .x=10

Düzenle:

Küpü koordinatlarla çizersek 111 , örümceğin başlangıç ​​pozisyonu ve 000 ise karınca pozisyonudur.(x,y,z)111000

Örümcek , 101 veya 110'a hareket edebilir .011101110

Küp simetrisi ile bunlar, ile gösterilen, karınca için beklenen sayıda aynı adıma sahip olmalıdır . Kaynaktan x 1 , biz ya kökenli dönebilir (olasılıkla 1 / 3 ya da (olasılıkla) 2 / 3 ) puanlama birine gitmek için 001 , 100 , 010 biz olan devlet ile ilgili olarak.x1x11/32/3001100010

Yine, simetri ile, bu noktalar, adlandırdığımız aynı sayıda beklenen adıma sahip olacaktır . Bu pozisyonların itibaren biz olasılık ile tek adımda hedefe ulaşabilir 1 / 3 veya birine geri dönmek x 1 olasılığıyla Yerlerinize 2 / 3 . Bu, x 0 = 1 olduğu anlamına gelir x01/3x12/3.x0=131+23(1+x1)=1+23x1


Cevabınızı daha da detaylandırabilir misiniz? Lütfen işten çıkarma şartlarını açıklayınız :)
Elizabeth Susan Joseph

17

Düşünecek güzel bir soyutlama şudur:

Karınca'nın Konumunu ve Örümcek ( 1 , 1 , 1 ) olarak düşünün , şimdi örümceğin yapabileceği her hareket esasen üç bileşenden birini 1 0 veya 0 1'den tam olarak değiştirecektir . Böylece soru olur:(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

En kısa yolun 3 anahtar olduğunu görüyoruz. Hangi bit ile başladığının önemi olmadığı için bunun olma olasılığı var 1 * 2/3 * 1/3 = 2/9. 1 hata yaparsak (bir bit'i 1'e geri döndürürsek) 5 adıma ihtiyacımız olacak. Ve hata yapma şansı 7 / 9'dur - eğer sadece bir hata yapmak istiyorsak, oradan geri dönüp her şeyi tekrar doğru yapmalıyız - yani 5 adımda tam olarak 1 hata yapma 7/9 * 2/9şansı ve şans 2 hata yapmanın yani aka 7 adım (7/9)² * 2/9vb.

Dolayısıyla, beklenen ortalama adım sayısının formülü şöyledir:

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

Çözümün biraz kafa karıştırıcı. Bu formül nedir? n burada ne var
Elizabeth Susan Joseph

5
Aslında en kısa ve en temiz çözüm. Çözüm, sıfırdan sonsuzluğa kadar sonsuz sayıda sayılar şeklindedir ve bu sonsuz toplamdaki nmevcut tam sayıdır.
alesc,

Bu gerçekten güzel! Cevabım benzer, ancak anahtarların dizisini çiftler halinde böler - bu da bir aritmetik-geometrik seriyi toplamak yerine geometrik bir değişken (veya alternatif olarak geometrik bir dizi toplamı) beklememi sağlar . Tek önemli fark bu: Birinin "ilk üç anahtarı, sonra sonraki çiftleri" (sizin yaptığınız gibi) alması veya "ilk anahtarı, ardından sonraki çiftleri" (benim yaptığım gibi) alması önemli değil, çünkü sineğin yakalanmadığı sürece 3 anahtarda, her iki durumda da bir tek ve iki eşit parite ile ilgileniyorsunuz.
Silverfish,

16

Sadece tiagotvv'un cevabını iltifat etmek için:

Doğal olarak bu tür sorunları matrisler olarak düşünmüyorum (öyle olsalar bile). Bunu yapmalıyım, ki aşağıda yaptım. Her biri As olan S'den taşınacak 3 yer olduğunu görebilirsiniz. Herhangi bir A'dan, S'ye dönebilir veya iki Odadan birine gidebilirsiniz. Herhangi bir B'den E'ye veya iki As'den birine gidebilirsiniz. Bunların hepsi tiagotvv tarafından verilen ve aynı zamanda grafik şeklinde de çizilebilen geçiş matrisine çevrilir.

görüntü tanımını buraya girin

Çünkü matematikte çok kötüyüm, sadece problemini simüle etmeye çalışırdım. Bunu R'deki markovchain paketi ile yapabilirsiniz.

  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())

görüntü tanımını buraya girin

  # 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

görüntü tanımını buraya girin

tiagotvv'nin cevabı R olarak hesaplanabilir:

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

xxxxxyz

Başlangıçta örümcek üç yönden herhangi birinde sıfır hamle yaptı, bu yüzden her bir yön için parite eşit. Karıncaya ulaşmak için her üç paritenin de çevrilmesi gerekir.

xyz

(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=2x4.5+1=10

P(Mm)=(79)m-1E(M)=Σm=1P(Mm)E(M)=Σm=1(79)m-1bir=1r=79 bir1-r=11-7/9=12/9=92E(N-)

Markov zinciri çözümlerinin karşılaştırılması

Bunu Markov zincir geçiş matrisinden nasıl saptamış olabilirim? @ DLDahly'nin gösterimini kullanarak, geçiş matrisindeki durumlar tuhaf parite ile yön sayısı sayısını açıklamama karşılık gelir.

Örümcek avı karınca küpü

Tek adımlı geçiş matrisi

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

İlk satır bize, bir hareketten sonra, örümceğin A durumunda olacağının garantili olduğunu gösteriyor (bir tek ve iki çift parite). İki aşamalı geçiş matrisi:

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

İkinci satır bize, örümcek A durumuna girdiğinde, iki hamlede ya olasılıkla A durumuna geri döndüğünü gösteriyor. 7/9 veya E durumuna (bütün garip pariteler) ulaştı ve olasılıkla karıncaları ele geçirdi 2/9. Böylece A durumuna ulaşıldığında, iki aşamalı geçiş matrisinden, gereken iki aşamalı hareket sayısının yukarıdaki gibi geometrik dağılım kullanılarak analiz edilebildiğini görüyoruz. Çözümümü bu şekilde bulmuyordum, ama bazen böyle bir modelin kullanılıp kullanılamayacağını görmek için geçiş matrisinin ilk birkaç gücünü hesaplamakta fayda var. Bunu zaman zaman bir matrisi ters çevirmek veya bir e-ödünç verme işlemini elle yapmak zorunda kalmaktan daha basit çözümler sunmak için buldum - kuşkusuz yalnızca sınav veya görüşme durumuyla gerçekten ilgili olan bir şey.


2

Sorunuzu sayısal olarak cevaplamak için kısa bir Java programı yazdım. Örümceğin traversi gerçekten rastlantısaldır, yani karıncaya girmeden önce döngülerde de hareket edebilir.

Ancak, "karşı köşe" terimini tanımlamamışsınız, bu yüzden iki farklı senaryo var. Aynı düzlem boyunca veya küpün karşısındaki gibi. İlk senaryoda, en kısa yol ikinci senaryoda 2 adım ve 3 adımdır.

100 milyon tekrar kullandım ve sonuçlar şöyle:

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

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

Kaynak kodu:

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: komut dosyasındaki bir yazım hatası düzeltildi (ve sonuçları da güncellendi)


2
Sanırım kenarların yanlış. Köşe 3'ün listesinde 7, ancak köşe 7'nin listesinde 3 yok. (Ben, köşeleri 0..7 sayıları ile eşleştirmenin Doğru Yolunun, her bit konumunun bir eksene karşılık geldiğini söylemek olduğunu, böylece bir kenarı geçmenin XOR'a 1, 2 veya 4 ile eşit olduğunu söylemek olduğunu söylerim.)
Gareth McCaughan

1
Yorum için teşekkürler. Köşe # 3'ü tanımlarken bir yazım hatası yaptım, öyle olmalı {0, 2, 6}. Programı yeniden çalıştırdım ve şu sonucu aldım: 10.00000836 # 0 köşesinden # 5 köşesine geçiş için adımlar (küpün gövdesi çapraz). Bu aynı zamanda @Hunaphu ile de tutarlıdır.
alesc,

Evet, çok daha iyi.
Gareth McCaughan

2

Sizin bilmecenizi Monte Carlo simülasyonları ile çözdüm (n=104) ve elde edilen mebirn(steps)10.

Monte Carlo Simülasyonu ($ n = 10 ^ 4 $)

İşte kullandığım R kodu:

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
Kod güzel ve açık - ancak kullanıcılarınızın yarısından bir buçuk saat boyunca yazdırılan bir milyon çizgiyi izlemesini istiyor! Ve doğru cevabı nasıl bilemezsin ki,10.000001? :-) FWIW, bunu Rbir saniyeye kadar hızlandırmak için bazı yerel işlevlerden yararlanabilirsiniz :n.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

Alesc'in "sağ köşede" terimini tanımlamamışsınız derken doğru yolda olduğuna inanıyorum. Soruda bir şey eksik olmadığı sürece doğru cevap yoktur, sadece varsayımlara dayalı cevaplar vardır. Küp boyutu tanımlanmamıştır. IE 10 kübik ft, 1000 kübik ft vs. Karınca büyüklüğü tanımlanmamıştır IE küçük bahçe, marangoz, dev kırmızı vb. Örümcek tipi tanımlanmamıştır (adım büyüklüğünü belirlemek için) IE küçük bahçe, Tarantula vb. "değişkenler. Cevap 0 adım veya belirlenmemiş / sınırsız adım olabilir.


3
Bu cevap, belki bir bahçe pozisyonu olmadıkça, bir sonraki görüşme seviyesine ulaşmayacaktır.
whuber

1
Bu durumda, “adım” ın bir düğümden (köşe) bitişik bir düğüme bir hareket anlamına geldiği yeterince açıktır ve bir küpün “karşı köşesinin” ne anlama geldiği oldukça açıktır - örneğin bir birim küp alır - eğer Karınca bir birim küpün köşesinde (x, y, z), örümcek (1-x, 1-y, 1-z) 'dedir (eğer karınca orijinli ise, örümcek (1,1)' dir. 1)). Bu nedenle, endişelerinizden hiçbiri, sorulan soru ile büyük ölçüde ilişkili görünmüyor. [Seçmenlere not: Bunun somut bir düzenleme olmadan bunun iyi bir cevap olduğunu düşünmüyorum, bunun bir silme oyu olması gerektiğini düşünmüyorum - yukarı ve aşağı oyların yeterli olacağı]
Glen_b

@Glen_b Sorunun ayrıntılarıyla ilgili netlik arayışında olduğu için, bunun muhtemelen büyük bir cevaptan ziyade bir yorum olduğunu düşünmüştüm.
Silverfish,

1
@ Silverfish Doğru olabilir, ancak o zaman 'cevap değil' olarak kapanır. Bunun yerine, normalde muhakeme ile desteklendiğinde bir cevap olarak kabul ettiğim "bu soruya cevap verilemez" denemesi olarak okudum, ancak nedenlerin sadece soruyu yanlış anlamaya dayandığını düşünüyorum.
Glen_b -Reinstate Monica
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.