개미는 입방체 모서리에 놓여 움직일 수 없습니다. 거미는 반대편 모서리에서 시작하여 확률로 큐브의 가장자리를 따라 모든 방향 으로 이동할 수 있습니다 . 거미가 개미에게 가야하는 단계는 평균 몇 개입니까?1 / 3
(이것은 숙제가 아니며 인터뷰 질문이었습니다.)
개미는 입방체 모서리에 놓여 움직일 수 없습니다. 거미는 반대편 모서리에서 시작하여 확률로 큐브의 가장자리를 따라 모든 방향 으로 이동할 수 있습니다 . 거미가 개미에게 가야하는 단계는 평균 몇 개입니까?1 / 3
(이것은 숙제가 아니며 인터뷰 질문이었습니다.)
답변:
각 상태가 거미와 개미 사이의 거리를 나타내는 Markov 체인으로 문제를 모델링하는 것이 좋습니다. 이 경우 거리 는 수 있으므로 4 개의 가능한 상태 가 있습니다 . i { 0 , 1 , 2 , 3 }
거미가 입방체의 반대편 모서리에있을 때, 개미로부터 3 걸음 떨어져 있습니다. 상태 .
전환 행렬 .
큐브를 그리면 상태 있을 때 마다 모든 움직임이 거미와 개미 사이의 거리를 2 단계로 줄입니다. 따라서 상태 있을 때 확률 1의 상태 로 이동합니다 .S 3 S 2
상태 있을 때 도착한 가장자리를 사용하여 상태 으로 돌아가 거나 다른 두 가장자리를 선택하면 거리를 한 단계 만 줄일 수 있습니다. 우리는 상태에있을 때 그래서, 우리는 상태로 이동할 수 확률이 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
이것은 3 개의 과도 상태 ( , , )와 하나의 흡수 상태 ( )를 가진 흡수 마르코프 체인입니다 .S 2 S 1 S 0
이론에 따르면, 천이 상태와 흡수 상태 를 갖는 마르코프 체인의 전이 행렬은 다음과 같이 다시 쓸 수 있습니다. P = [ Q t R 0 r × t I r ]
여기서 는 일부 과도 상태에서 다른 과도 상태로 전이 할 확률을 나타내는 행렬이며 은 다음 중 하나에서 전이 할 가능성 이있는 행렬입니다. 과도은 중 하나에 상태 흡수 상태. 항등 행렬 은 흡수 상태 중 하나에 도달하면 해당 상태에서 벗어나지 않음을 보여줍니다 . 모든 제로 행렬 는 흡수 상태에서 로의 전이가없는 것으로 해석 될 수 있습니다. t×t R t×t r I r r 0 r × t r t 과도 상태.
의 엔트리 상태에서 전이의 확률을 나타내는 상태로 정확히 하나의 단계. 단계 의 확률을 얻으려면 의 항목이 필요합니다 . 모든 합하면 과도 상태 에서 시작한 후 과도 상태 로의 예상 방문 수를 항목에 포함하는 행렬을 얻습니다 .Q t i j k ( i ,Q k t k ( i , j ) j i
흡수 될 때까지 단계 수를 얻으려면 의 각 행 값을 합산하십시오 . 이것은로 나타낼 수 있습니다
여기서 은 모든 구성 요소가 1 인 열 벡터입니다.
우리의 경우에 이것을 적용하자 :
위에서 언급 한 바와 같이, 우리의 경우에 우리는 = 3 과도 상태와 = 1 흡수 상태를 가진다 : r Q t
방문수가 예상되는 행렬은
이 행렬은 다음과 같이 해석 될 수 있습니다. 상태 에서 시작 하여 흡수되기 전에 평균적으로 2.5 배, 4.5 배, 3 회 방문합니다.S 0 S 3 S 2 S 1
상태 에서 상태 까지의 예상 단계 수 는 다음 벡터의 첫 번째 구성 요소에 의해 제공됩니다.S 0
의 두 번째 및 세 번째 구성 요소는 각각 및 에서 시작하는 경우 예상되는 단계 수입니다 .S 0 S 2 S 1
하자 예상 단계의 수를합니다. 하자 거미와의 기원에 인접한 모든 코너에서 예상 단계의 숫자 개미에 대한 저두 요.
그런 다음 및 입니다. 이후
우리는 얻을 . 따라서 은 및 암시합니다 .
우리는 으로 답을 얻습니다 .
좌표 로 큐브를 그리면 은 거미의 시작 위치이며 은 개미의 위치입니다.
거미는 , 또는 이동할 수 있습니다 .
큐브의 대칭에 의해, 이들은 개미에 대해 동일한 수의 예상 단계를 가져야하며 로 표시됩니다 . 에서 , 우리는 하나 (확률 원점으로 돌아갈 수 또는 (확률) ) 우리가 지점 중 하나에 갈 수 , , 우리가 어느 상태에 따라.X 1 1 / 3
다시 한 번 대칭으로,이 점들은 이라고하는 동일한 단계 수를 갖습니다 . 이 위치에서 우리는 확률로 한 단계로 목표에 도달 하거나 확률로 위치 중 하나로 돌아갈 수 있습니다. 이는 입니다. 1 / 3 (X) 1 2 / 3 X 0 = 1
그것을 생각하는 좋은 추상화는 다음과 같습니다.
Ant의 위치를 및 Spider . 이제 스파이더가 움직일 수있는 각 움직임은 본질적으로 3 개의 구성 요소 중 하나를 또는 로 정확히 전환합니다 . 따라서 질문은 다음과 같습니다.
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 비트를 1로 다시 전환) 5 단계가 필요합니다. 실수를 할 확률은 7/9입니다. 실수를 한 번만하려면 다시 거기에서 돌아와서 모든 것을 다시해야합니다. 따라서 정확히 1 개의 실수를해서 5 단계를 초래할 7/9 * 2/9
가능성은 2 개의 실수 (일명 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
패리티 고려 사항은 놀랍도록 간단한 기계를 사용하여 매우 깨끗한 솔루션을 제공합니다. Markov 체인 없음, 반복되는 기대치 없음, 고등학교 수준 요약 만. 기본 아이디어는 거미가 방향으로 짝수 번 움직 인 경우 원래 좌표 로 돌아가서 개미의 위치에있을 수 없다는 것입니다. 방향으로 홀수 번 이동 한 경우 좌표는 개미와 일치합니다. 세 방향 모두에서 홀수 번 이동 한 경우에만 개미 의 , 및 좌표 와 일치합니다 .
처음에 거미는 세 방향 중 어느 방향으로도 이동하지 않았으므로 각 방향의 패리티는 짝수입니다. 개미에 도달하려면 세 패리티를 모두 뒤집어 야합니다.
스파이더의 첫 번째 이동 ( 방향으로 레이블 지정 ) 후 정확히 한 방향은 홀수 패리티를 가지며 다른 두 방향 ( 및 )은 짝수입니다. 개미를 잡으려면이 두 패리티 만 뒤집어 야합니다. 홀수의 후속 이동에서는 달성 할 수 없으므로 지금부터는 이동 쌍 을 고려 합니다. 첫 번째 페어 이동에는 9 가지 가능한 조합이 있습니다.
우리는 한 쌍의 움직임 후에 개미에 도달하기 위해 와 방향으로 움직여야하며, 9 가지 조합 중 2 가지가 이것을 달성 할 것입니다 : 및 는 세 패리티가 모두 홀수임을 보장합니다.
다른 7 개의 조합은 하나의 홀수와 두 개의 짝수 패리티를 남깁니다. , 또는 의 세 번의 반복 된 움직임 은 모든 패리티를 변경하지 않은 채로두고 개미에 도달 하려면 하나의 와 움직임이 여전히 필요합니다 . 다른 쌍에는 방향의 움직임을 포함하여 두 개의 뚜렷한 움직임이 있습니다 . 이것은 의 패리티 와 다른 패리티 중 하나 ( 또는 )를 전환하므로 여전히 하나의 홀수 및 두 개의 짝수 패리티가 남습니다. 예를 들어, 쌍 는 하나 더 와 하나 더개미에 도달하기 위해 : 우리가 이전에 있었던 것과 동등한 상황 (축의 레이블을 바꾼 후). 그런 다음 동일한 방식으로 다음 쌍 이동을 분석 할 수 있습니다.
일반적으로 짝을 이루는 동작은 1 개의 홀수 및 2 개의 짝수 패리티로 시작하며, 3 개의 홀수 패리티 (확률 )와 개미의 즉각적 캡처 또는 1 개의 홀수 및 2 개의 짝수 패리티 ( 확률 )을 사용하면 동일한 상황으로 돌아갑니다.
은 개미에 도달하는 데 필요한 한 쌍의 이동 수로 하자 . 분명히 지지체에 기하학적 분포는 다음 성공의 확률 이므로 평균 갖는다 입니다. 하자 초기 이동하고 포함한 필요한 이동의 총 숫자 후속 쌍의 이동. 그런 다음 이므로 기대치의 선형성을 적용합니다. .NMN=2M+1E(N)=2E(M)+1=2×4.5+1=10
또는 하고 음이 아닌 정수 값만 사용하는 불연속 분포 의 평균에 대해 잘 알려진 공식을 적용 할 수 있습니다 . . 이는 범 최초 용어와 등비이고 일반적인 비율 합은 . 그런 다음 이전과 같이 을 사용할 수 있습니다 .E(M)=∑ ∞ m = 1 P(M≥m)
Markov 체인 솔루션과 비교
Markov chain transition matrix에서 이것을 어떻게 발견했을 수 있습니까? @DLDahly의 표기법을 사용하여 전이 행렬의 상태는 홀수 패리티가있는 방향 수의 설명에 해당합니다.
1 단계 전이 행렬은
첫 번째 행은 한 번의 움직임 후에 스파이더가 상태 A (1 홀수 및 2 짝수 패리티)에 있음을 보여줍니다. 2 단계 전이 행렬은 다음과 같습니다.
스파이더 두 이동 시간에, 상태 (A)에 입력되면 그 중 확률 상태 (A)로 복귀했다고 번째 행 쇼 우릴 probabilty로, 또는 상태 E (홀수 패리티)에 도달하고 앤트 캡처 . 따라서 상태 A에 도달하면 2 단계 전이 행렬에서 필요한 2 단계 이동 수를 위와 같은 기하 분포를 사용하여 분석 할 수 있습니다. 이것은 내 솔루션을 찾은 방법이 아니지만 때로는 유용한 패턴을 활용할 수 있는지 확인하기 위해 전이 행렬의 처음 몇 가지 힘을 계산할 가치가 있습니다. 나는 때때로 이것이 시험이나 인터뷰 상황에서만 실제로 관련이있는 것으로 매트릭스를 뒤집거나 고유 분해를 수행하는 것보다 간단한 솔루션을 제공하는 것으로 나타났습니다.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 와도 일치합니다.
Monte Carlo 시뮬레이션 ( )을 통해 수수께끼를 .m은 전자 N ( S t의 전자 P S ) ≈ 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))
R
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)]
"하지만 반대편 구석"이라는 용어를 정의하지 않았을 때 alesc가 올바른 방향으로 가고 있다고 생각합니다. 질문에 빠진 것이 없다면, 정답이없고 가정에 근거한 답입니다. 큐브 크기는 정의되어 있지 않습니다. IE 10 입방 피트, 1000 입방 피트 등. 개미 크기는 정의되지 않음 IE 작은 정원, 목수, 거대한 빨간색 등, 스파이더 유형이 정의되지 않았습니다 (단계 크기를 결정하기 위해) IE 작은 정원, 독거미 등. "변수. 답은 0 단계 또는 결정되지 않은 / 무한 단계 수일 수 있습니다.