随机走在立方体的边缘


35

一只蚂蚁被放置在立方体的一角,无法移动。蜘蛛从对角开始,可以沿立方体的边缘沿任何方向以相等概率移动。平均而言,蜘蛛需要到达蚂蚁多少步?(x,y,z)1/3

(这不是家庭作业,这是一个面试问题。)


7
家庭作业?你试过什么了?
阿德里安

关于Markov链,这是一个很棒的介绍setosa.io/blog/2014/07/26/markov-chains
DL Dahly 2015年

1
通常,此类常规工作簿应使用self-study标签进行标记,并遵循其标签Wiki上的指南。请编辑此问题,并将其包括在以后的类似问题中
Glen_b -Reinstate Monica

4
@GarethMcCaughan-不,这是一个面试问题。
伊丽莎白·苏珊·约瑟夫

在@alesc之后,我做了一个JavaScript Plunker。plnkr.co/edit/jYQVDI
abbaf33f

Answers:


32

我建议将问题建模为马尔可夫链,其中每个状态代表蜘蛛和蚂蚁之间的距离。在这种情况下,我们有4个可能的状态因为距离可以为。Sii{0,1,2,3}

当蜘蛛位于立方体的相对角时,它与蚂蚁的距离为3步。它处于状态。S3

建立过渡矩阵。P

  • 如果绘制一个立方体,我们会看到当我们处于状态,每次移动都会将蜘蛛和蚂蚁之间的距离减少到2步。因此,当我们处于状态我们以概率1 移至状态。S3S3S2

  • 当我们处于状态,可以使用从那里到达的边缘返回到状态,或者如果我们选择其他两个边缘,则可以将距离减小到仅一步。因此,当我们处于状态我们可以以概率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=[P小号3小号3P小号3小号2P小号3小号1个P小号3小号0P小号2小号3P小号2小号2P小号2小号1个P小号2小号0P小号1个小号3P小号1个小号2P小号1个小号1个P小号1个小号0P小号0小号3P小号0小号2P小号0小号1个P小号0小号0]=[01个001个/302/3002/301个/30001个]

这是具有三个过渡状态(,,)和一个吸收状态()的吸收马尔可夫链。S 2 S 1 S 0小号3小号2小号1个小号0

根据该理论,具有瞬态和吸收态的马尔可夫链的转移矩阵可以重写为: r P = [ Q tŤ[R

P=[Ť[R0[R׍一世[R]

其中是一个矩阵,它显示了从某个瞬态过渡到另一个瞬态的可能性,而是一个矩阵,具有从一个瞬态转换为该过渡状态的一个吸收的状态。单位矩阵向我们显示,当达到吸收状态中的任何一个时,没有离开该状态的转换。全零矩阵可以解释为从任何吸收状态到任何吸收状态都没有过渡 t×t R t×rtr I rŤŤ×Ť[RŤ×[RŤ[R一世[R0 r × t r t[R0[R׍[RŤ 瞬态。

的项表示仅在一个步骤中从状态转换为状态概率。为了获得步的概率,我们需要的 项。对于所有求和,我们得到一个矩阵,该矩阵的项中包含从瞬时状态开始之后对瞬时状态的预期访问次数。Q t i j k i j Q k t k i j j i一世ĴŤ一世Ĵķ一世ĴŤķķ一世ĴĴ一世

ķ=0Ťķ=一世Ť-Ť-1个

要获取直到被吸收为止的步数,只需将的每一行的值相加即可。这可以表示为一世Ť-Ť-1个

Ť=一世Ť-Ť-1个1个

其中是所有分量等于1的列向量。1个

让我们将此应用于我们的案例:

如上所述,在我们的情况下,我们有 = 3个瞬态和 = 1吸收态,因此: r Q t = [ 0 1 0 1 /Ť[R

Ť=[01个01个/302/302/30][R=[001个/3]

预期访问次数的矩阵为

一世Ť-Ť-1个=[2.54.531.54.531个33]

该矩阵可以解释如下。从状态开始,在被吸收之前,我们平均访问 2.5次, 4.5次和 3次。S 0小号3小号0S 2 S 1小号3小号2小号1个

从状态到状态的预期步数由以下向量的第一部分给出:S 0小号3小号0

Ť=[2.54.531.54.531个33][1个1个1个]=[1097]

如果我们分别从和开始,的第二和第三部分是到的预期步数。S 0 S 2 S 1Ť小号0小号2小号1个


我不知道什么是mcmc。我必须阅读它,然后检查您的解决方案。有什么好的mcmc解释可以补充您的解决方案吗?
伊丽莎白·苏珊·约瑟夫

10
@ElizabethSusanJoseph注意,马尔可夫链和MCMC(马尔可夫链蒙特卡洛)是两个不同的概念(尽管MCMC基于马尔可夫链)。此答案不使用MCMC。因此,您可能正在寻找有关Markov链而不是MCMC的很好的解释。
Juho Kokkala 2015年

通过定义和解释转换矩阵P的使用,数量r的含义以及列向量的高度,可以改善您的解释。向量t后续元素含义的加分点。:)
Alexis

@JuhoKokkala-谢谢,我然后看一下马尔可夫链的解释。
伊丽莎白·苏珊·约瑟夫

@Alexis我添加了有关矩阵和向量的一些解释。
tiagotvv 2015年

21

令为预期步数。令为与蜘蛛原点相邻的任意角的预期步数,而为蚂蚁的同上。x 1 x 0XX1个X0

然后和。由于 x 0 = 1 + 2X=1个+X1个x 1 = 1 + 2X0=1个+23X1个

X1个=1个+23X0+1个3X=1个+23X0+1个3+1个3X1个

我们得到。因此表示和。x 0 = 1 + 2X1个=X0+2 x0x0=1+23x0+43x 1 = 9x0=7x1=9

我们得到的答案是。x=10

编辑:

如果我们用坐标绘制立方体,则是蜘蛛的起始位置,是蚂蚁的位置。111 000(x,y,z)111000

蜘蛛可以移动到任意,或。101 110011101110

通过立方体的对称性,它们必须具有与蚂蚁相同的预期步数,以表示。从,我们可以回到原点(概率为)或(概率为),我们可以去点一个,,取决于我们在其中的状态。X 1 1 / 3 2 / 3x1x11/32/3100 010001100010

同样,通过对称性,这些点将具有相同的预期步数,我们称之为。从这些位置,我们可以以概率一步一步达到目标,或者以概率回到位置之一。这意味着 。 1 / 3 X 1 2 /x01/3x12/3x0=131+23(1+x1)=1+23x1个


您能否进一步阐述您的答案?请以通俗的方式解释:)
伊丽莎白·苏珊·约瑟夫

17

可以想到的一个很好的抽象是:

将蚂蚁的位置想象为和Spider,现在蜘蛛可以进行的每一次移动实际上将精确地从或切换三个分量之一。所以问题变成了:1 1 1 1 0 0 (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的机会是犯两个错误,也就是7个步骤(7/9)² * 2/9,依此类推。

因此,预期平均步骤数的公式为:

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

您的解决方案有些令人困惑。这个公式是什么?这里是什么?
伊丽莎白·苏珊·约瑟夫

5
它实际上是最短最干净的解决方案。该解的形式是从零到无穷大的数字无限和,并且n是该无限和中的当前整数。
alesc

真是太好了!我的回答是相似的,但是将开关序列分成两对-使我可以期望一个几何变量(或者,求和一个几何级数),而不是求和一个算术-几何级数。那是唯一的实质性区别:采取“前三个开关,然后是后对”(就像你所做的)还是“先开关,然后是后对”(就像我一样)并不重要,因为除非抓住了苍蝇。在3个开关中,那么无论哪种方式,您都将处理一个奇数和两个偶数奇偶校验。
银鱼

16

只是为了赞美tiagotvv的答案:

我自然不会将这类问题视为矩阵(即使它们确实如此)。我必须把它画出来,下面我会做。您可以看到从S移出3个位置,所有位置均为As。您可以从任何一个A返回到S,或移至两个B之一。您可以从任何B移至E,或移至两个As之一。所有这些都转换为由tiagotvv给定的转换矩阵,也可以以图形形式绘制。

在此处输入图片说明

因为我的数学太糟糕了,所以我只会尝试模拟您的问题。您可以使用R中的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 Xxxxxxžyz

最初,蜘蛛在三个方向中的任何一个方向上都进行了零移动,因此每个方向的奇偶性都是偶数。这三个奇偶校验需要翻转才能到达蚂蚁。

在蜘蛛的第一个动作(让我们标记为方向)之后,正好一个方向具有奇偶校验,而另外两个方向(和)是偶数。要抓住蚂蚁,只需要颠倒这两个奇偶校验。由于无法通过大量后续动作来实现,因此从现在开始,我们将考虑成对的动作。第一个配对的动作有九种可能的组合:xžyz

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

我们需要在和方向上移动一对配对后才能到达蚂蚁,并且九个组合中的两个将实现此目的:和将确保所有三个奇偶校验都是奇数的。z y z zyz(y,z)(z,y)

其他七个组合留下一个奇数和两个偶数奇偶校验。,或这三个重复的动作使所有奇偶校验保持不变,因此我们仍然需要一个和一个动作才能到达蚂蚁。其他对包含两个不同的移动,其中一个沿方向移动。这将切换的奇偶校验和另一个奇偶校验(或),因此我们仍然剩下一个奇数和两个偶数奇偶校验。例如,使我们需要再增加和y y z z y z x x y z x z x(x,x)(y,yžžÿžXXÿžXžXÿ到达蚂蚁:相当于我们之前的情况(在重新标记轴之后)。然后,我们可以用相同的方式分析下一个配对的动作。

通常,成对移动以一个奇数和两个偶数奇偶校验开始,并以三个奇数个奇偶校验(概率为)和立即捕获蚂蚁结束,或者以一个奇数和两个偶数奇偶校验(概率),这使我们回到了相同的情况。2979

令为到达蚂蚁所需的成对移动次数。显然,遵循支撑上的几何分布,成功概率为所以平均值。令为所需移动总数,包括初始移动和后续配对移动。那么因此,应用期望线性度。中号{ 1 2 3 ... } p中号中号{1个23} EM=p1p=29Ñ中号Ñ=2中号+1个ÈÑ=2È中号+1=2×4.5+1Ë中号=p-1个=92=4.5ñ中号N=2M+1Ëñ=2Ë中号+1个=2×4.5+1个=10

另外,您可能会注意到并为仅采用非负整数值的离散分布均值应用众所周知的公式,。这给出,这是第一项且常见的几何级数比率所以总和。然后,我们可以像以前一样使用。 È中号=&Sigma; = 1 P中号 ë中号=&Sigma; = 1P中号=79-1个Ë中号==1个P中号Ë中号==1个79-1个一种=1个[R=79 一种1个-[R=1个1个-7/9=1个2/9=92Ëñ

与马尔可夫链解决方案的比较

我如何从马尔可夫链转移矩阵中发现这一点?使用@DLDahly的表示法,转换矩阵中的状态与我对奇数奇偶性方向数的描述相对应。

蜘蛛猎蚁在多维数据集

一步转换矩阵为

P=[P小号小号P小号一种P小号P小号ËP一种小号P一种一种P一种P一种ËP小号P一种PPËPË小号PË一种PËPËË]=[01个001个/302/3002/301个/30001个]

第一行向我们表明,移动一次后,蜘蛛将处于状态A(一个奇数和两个偶数奇偶校验)。两步过渡矩阵为:

P2=P2=[1个/302/3007/902/92/904/91个/30001个]

第二行向我们显示,一旦蜘蛛进入状态A,经过两次移动,它要么以概率返回状态A,要么以状态概率到达状态E(所有奇数奇偶性)并捕获了蚂蚁。。因此,到达状态A后,我们从两步过渡矩阵中看到,可以使用上述几何分布来分析所需的两步移动次数。这不是我找到解决方案的方式,但是有时值得计算转换矩阵的前几个幂,以查看是否可以利用这种有用的模式。我偶尔会发现,这比提供手动转换矩阵或进行特征分解的方法更简单-当然,这仅与考试或面试情况有关。2 / 97/92/9


2

我编写了一个简短的Java程序,以数字方式回答您的问题。蜘蛛的遍历确实是随机的,这意味着它也可以在到达蚂蚁之前以周期遍历。

但是,您没有定义术语“对角”,因此我有两种不同的情况。与同一平面或多维数据集相反。在第一种情况下,最短路径是2个步骤,在第二种情况下是3个步骤。

我使用了1亿次重复,结果如下:

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

    }

}

编辑:修复了脚本中的错字(也更新了结果)


2
我认为您的观点是错误的。角落3的清单中有7个,但角落7的清单中没有3个。(我建议将顶点映射到数字0..7的正确方法是说每个位的位置都对应一个轴,因此遍历边等于1、2或4的XOR。)
Gareth McCaughan

1
感谢您的评论。在定义3号角时,我已经打错了字,应该是{0, 2, 6}。我已经重新运行该程序,并得到以下结果:从#0角到#5角(立方体的对角线)的遍历步骤为10.00000836。这也与@Hunaphu一致。
alesc

是的,好多了。
Gareth McCaughan,2015年

2

我通过蒙特卡洛模拟()解决了您的难题,并获得了。ë 一个Ñ 小号Ë p 小号10ñ=104Ë一种ñsŤËps10

蒙特卡洛模拟($ 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
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)]

-1

我相信alesc在提到“但是,您没有定义术语“对角”时就走了正确的道路,除非我在问题中遗漏了什么,否则没有正确的答案,只是基于假设的答案。 IE 10立方英尺,1000立方英尺等。未定义蚂蚁大小IE小花园,木匠,巨型红色等,未定义蜘蛛类型(确定步长)IE小花园,塔兰图拉毒蛛。如果您将所有“未定义”组合在一起答案可能是0步,也可能是不确定/无限的步数。


3
除非可能是从事园艺工作,否则这个答案将不会使面试更上一层楼。
胡伯

1
在这种情况下,“步”的含义很明显,即“从一个节点(角)到相邻节点的移动”,并且很清楚,多维数据集的“相对角”意味着什么-以单位立方为例-如果蚂蚁在单位立方体的角(x,y,z)处,蜘蛛在(1-x,1-y,1-z)处(因此,如果蚂蚁在原点,蜘蛛在(1,1 ,1))。因此,您所关心的似乎都与所提出的问题无关。[给选民的注意:虽然我认为如果没有实质性修改,这不是一个好的答案,但我认为这不应该成为删除选票的主题-上下选票就足够了]
Glen_b-恢复莫妮卡

@Glen_b既然它似乎正在寻求澄清问题的具体内容,所以我认为这可能只是作为评论,而非实质性回答。
Silverfish

1
@Silverfish您可能是正确的,但随后会以“不是答案”的形式关闭。相反,我读它的目的是试图说“这个问题是无法回答的”,当我支持推理时,我通常将其视为答案,但是我认为原因仅仅是基于对问题的误解。
Glen_b-恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.