一只蚂蚁被放置在立方体的一角,无法移动。蜘蛛从对角开始,可以沿立方体的边缘沿任何方向以相等概率移动。平均而言,蜘蛛需要到达蚂蚁多少步?
(这不是家庭作业,这是一个面试问题。)
self-study
标签进行标记,并遵循其标签Wiki上的指南。请编辑此问题,并将其包括在以后的类似问题中
一只蚂蚁被放置在立方体的一角,无法移动。蜘蛛从对角开始,可以沿立方体的边缘沿任何方向以相等概率移动。平均而言,蜘蛛需要到达蚂蚁多少步?
(这不是家庭作业,这是一个面试问题。)
self-study
标签进行标记,并遵循其标签Wiki上的指南。请编辑此问题,并将其包括在以后的类似问题中
Answers:
我建议将问题建模为马尔可夫链,其中每个状态代表蜘蛛和蚂蚁之间的距离。在这种情况下,我们有4个可能的状态因为距离可以为。
当蜘蛛位于立方体的相对角时,它与蚂蚁的距离为3步。它处于状态。
建立过渡矩阵。
如果绘制一个立方体,我们会看到当我们处于状态,每次移动都会将蜘蛛和蚂蚁之间的距离减少到2步。因此,当我们处于状态我们以概率1 移至状态。
当我们处于状态,可以使用从那里到达的边缘返回到状态,或者如果我们选择其他两个边缘,则可以将距离减小到仅一步。因此,当我们处于状态我们可以以概率2/3 进入状态,并以概率1/3 进入状态。S 3 S 2 S 1 S 3
当我们处于状态,我们可以使用三个可能的边之一进入状态。如果使用其他两个,则返回状态。因此,当我们处于状态我们可以以1/3的概率移至状态,并以概率2/3 移至状态。S 0 S 2 S 1 S 0 S 2
当我们进入状态,我们就呆在那里,因为这是我们的目标。是吸收状态。S 0
这是具有三个过渡状态(,,)和一个吸收状态()的吸收马尔可夫链。S 2 S 1 S 0
根据该理论,具有瞬态和吸收态的马尔可夫链的转移矩阵可以重写为: r P = [ Q t
其中是一个矩阵,它显示了从某个瞬态过渡到另一个瞬态的可能性,而是一个矩阵,具有从一个瞬态转换为该过渡状态的一个吸收的状态。单位矩阵向我们显示,当达到吸收状态中的任何一个时,没有离开该状态的转换。全零矩阵可以解释为从任何吸收状态到任何吸收状态都没有过渡 t×t R t×rtr I r0 r × t r t 瞬态。
的项表示仅在一个步骤中从状态转换为状态概率。为了获得步的概率,我们需要的 项。对于所有求和,我们得到一个矩阵,该矩阵的项中包含从瞬时状态开始之后对瞬时状态的预期访问次数。Q t i j k (i ,j )Q k t k (i ,j )j i
要获取直到被吸收为止的步数,只需将的每一行的值相加即可。这可以表示为
其中是所有分量等于1的列向量。
让我们将此应用于我们的案例:
如上所述,在我们的情况下,我们有 = 3个瞬态和 = 1吸收态,因此: r Q t = [ 0 1 0 1 /
预期访问次数的矩阵为
该矩阵可以解释如下。从状态开始,在被吸收之前,我们平均访问 2.5次, 4.5次和 3次。S 0S 2 S 1
从状态到状态的预期步数由以下向量的第一部分给出:S 0
如果我们分别从和开始,的第二和第三部分是到的预期步数。S 0 S 2 S 1
令为预期步数。令为与蜘蛛原点相邻的任意角的预期步数,而为蚂蚁的同上。x 1 x 0
然后和。由于 x 0 = 1 + 2x 1 = 1 + 2
我们得到。因此表示和。x 0 = 1 + 2 x0x 1 = 9
我们得到的答案是。
如果我们用坐标绘制立方体,则是蜘蛛的起始位置,是蚂蚁的位置。111 000
蜘蛛可以移动到任意,或。101 110
通过立方体的对称性,它们必须具有与蚂蚁相同的预期步数,以表示。从,我们可以回到原点(概率为)或(概率为),我们可以去点一个,,取决于我们在其中的状态。X 1 1 / 3 2 / 3100 010
同样,通过对称性,这些点将具有相同的预期步数,我们称之为。从这些位置,我们可以以概率一步一步达到目标,或者以概率回到位置之一。这意味着 。 1 / 3 X 1 2 /
可以想到的一个很好的抽象是:
将蚂蚁的位置想象为和Spider,现在蜘蛛可以进行的每一次移动实际上将精确地从或切换三个分量之一。所以问题变成了:(1 ,1 ,1 )1 → 0 0 →
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
,依此类推。
因此,预期平均步骤数的公式为:
n
是该无限和中的当前整数。
只是为了赞美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
奇偶性考量使用非常简单的机制提供了一个非常干净的解决方案:没有马尔可夫链,没有反复的期望,只有高中水平的总和。基本思想是,如果蜘蛛在方向上移动了偶数次,则它已返回到其原始坐标,因此不能位于蚂蚁的位置。如果它在方向上移动了奇数次,则其坐标与蚂蚁的坐标匹配。仅当它在所有三个方向上移动了奇数次时,它才与蚂蚁的,和坐标相匹配。X X X Xž
最初,蜘蛛在三个方向中的任何一个方向上都进行了零移动,因此每个方向的奇偶性都是偶数。这三个奇偶校验需要翻转才能到达蚂蚁。
在蜘蛛的第一个动作(让我们标记为方向)之后,正好一个方向具有奇偶校验,而另外两个方向(和)是偶数。要抓住蚂蚁,只需要颠倒这两个奇偶校验。由于无法通过大量后续动作来实现,因此从现在开始,我们将考虑成对的动作。第一个配对的动作有九种可能的组合:ž
我们需要在和方向上移动一对配对后才能到达蚂蚁,并且九个组合中的两个将实现此目的:和将确保所有三个奇偶校验都是奇数的。z (y ,z )(z
其他七个组合留下一个奇数和两个偶数奇偶校验。,或这三个重复的动作使所有奇偶校验保持不变,因此我们仍然需要一个和一个动作才能到达蚂蚁。其他对包含两个不同的移动,其中一个沿方向移动。这将切换的奇偶校验和另一个奇偶校验(或),因此我们仍然剩下一个奇数和两个偶数奇偶校验。例如,使我们需要再增加和(y ,y )(z ,z )y z x x y z (x ,z )x到达蚂蚁:相当于我们之前的情况(在重新标记轴之后)。然后,我们可以用相同的方式分析下一个配对的动作。
通常,成对移动以一个奇数和两个偶数奇偶校验开始,并以三个奇数个奇偶校验(概率为)和立即捕获蚂蚁结束,或者以一个奇数和两个偶数奇偶校验(概率),这使我们回到了相同的情况。
令为到达蚂蚁所需的成对移动次数。显然,遵循支撑上的几何分布,成功概率为所以平均值。令为所需移动总数,包括初始移动和后续配对移动。那么因此,应用期望线性度。中号{ 1 ,2 ,3 ,... } p E(M)=p−1Ñ中号Ñ=2中号+1个È(Ñ)=2È(中号)+1=2×4.5+1
另外,您可能会注意到并为仅采用非负整数值的离散分布的均值应用众所周知的公式,。这给出,这是第一项且常见的几何级数比率所以总和。然后,我们可以像以前一样使用。 È(中号)=&Sigma; ∞ 米= 1 P(中号≥米) ë(中号)=&Sigma; ∞ 米= 1
与马尔可夫链解决方案的比较
我如何从马尔可夫链转移矩阵中发现这一点?使用@DLDahly的表示法,转换矩阵中的状态与我对奇数奇偶性方向数的描述相对应。
一步转换矩阵为
第一行向我们表明,移动一次后,蜘蛛将处于状态A(一个奇数和两个偶数奇偶校验)。两步过渡矩阵为:
第二行向我们显示,一旦蜘蛛进入状态A,经过两次移动,它要么以概率返回状态A,要么以状态概率到达状态E(所有奇数奇偶性)并捕获了蚂蚁。。因此,到达状态A后,我们从两步过渡矩阵中看到,可以使用上述几何分布来分析所需的两步移动次数。这不是我找到解决方案的方式,但是有时值得计算转换矩阵的前几个幂,以查看是否可以利用这种有用的模式。我偶尔会发现,这比提供手动转换矩阵或进行特征分解的方法更简单-当然,这仅与考试或面试情况有关。2 / 9
我编写了一个简短的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)));
}
}
编辑:修复了脚本中的错字(也更新了结果)
{0, 2, 6}
。我已经重新运行该程序,并得到以下结果:从#0角到#5角(立方体的对角线)的遍历步骤为10.00000836。这也与@Hunaphu一致。
我通过蒙特卡洛模拟()解决了您的难题,并获得了。米ë 一个Ñ (小号吨Ë p 小号) ≈ 10
这是我使用的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))
我相信alesc在提到“但是,您没有定义术语“对角”时就走了正确的道路,除非我在问题中遗漏了什么,否则没有正确的答案,只是基于假设的答案。 IE 10立方英尺,1000立方英尺等。未定义蚂蚁大小IE小花园,木匠,巨型红色等,未定义蜘蛛类型(确定步长)IE小花园,塔兰图拉毒蛛。如果您将所有“未定义”组合在一起答案可能是0步,也可能是不确定/无限的步数。