Làm thế nào một người nên chấp nhận vấn đề Dự án Euler 213 (Xiếc Flea Circus ')?


11

Tôi muốn giải quyết Project Euler 213 nhưng không biết bắt đầu từ đâu vì tôi là giáo dân trong lĩnh vực Thống kê, lưu ý rằng cần có câu trả lời chính xác để phương pháp Monte Carlo không hoạt động. Bạn có thể giới thiệu một số chủ đề thống kê để tôi đọc không? Xin vui lòng không đăng giải pháp ở đây.

Rạp xiếc

Một ô vuông 30 × 30 chứa 900 con bọ chét, ban đầu là một con bọ chét trên mỗi ô vuông. Khi chuông rung, mỗi con bọ chét nhảy đến một hình vuông liền kề một cách ngẫu nhiên (thường là 4 khả năng, ngoại trừ bọ chét trên mép lưới hoặc ở các góc).

Số lượng hình vuông không có người trông đợi sau 50 vòng chuông là bao nhiêu? Đưa ra câu trả lời của bạn làm tròn đến sáu chữ số thập phân.


7
Phương pháp Monte Carlo có thể đưa ra câu trả lời rất chính xác miễn là bạn thực hiện đủ mô phỏng.
Rob Hyndman

3
Nếu bạn muốn một giải pháp lập trình, monte carlo là cách tiếp cận duy nhất. Tôi không thấy bất kỳ lý do tại sao bạn sẽ không nhận được câu trả lời chính xác bằng cách sử dụng monte carlo. Một giải pháp toán học / phân tích có thể không dễ dàng.

Tôi đã thấy cuộc thảo luận về Monte Carlo và mọi người nói rằng nếu bạn muốn đạt được 6 chữ số thập phân, sẽ mất quá nhiều thời gian hoặc có lẽ tôi bị nhầm lẫn với các vấn đề tương tự khác. Vì việc viết mã theo cách tiếp cận Monte Carlo khá dễ dàng, tôi đoán rằng sẽ rất đáng để thử trước.
Grokus

4
Tôi không tranh chấp bất kỳ câu trả lời nào trong ba câu trả lời trước, nhưng phân tích (đơn giản) trong câu trả lời tôi đã đưa ra sẽ đưa ra những nhận xét này: nếu bạn muốn có độ chính xác sáu chữ số thập phân để ước tính một số sẽ nằm trong hàng trăm, mô phỏng Monte Carlo sẽ mất ít nhất một năm trên một máy có 10.000 CPU chạy song song.
whuber

Có phải tất cả các con bọ chét bị mắc kẹt (tức là vấn đề thực sự là về các hình vuông có nhiều hơn một con bọ chét trên chúng) hay đây là về bọ chét trên các cạnh nhảy ra và biến mất?
MissMonicaE

Câu trả lời:


10

Bạn đúng; Monte Carlo là không thể. (Trong một mô phỏng ngây thơ - có nghĩa là, một trong những chính xác tái tạo tình hình vấn đề mà không bất kỳ đơn giản hóa - mỗi lần lặp sẽ bao gồm 900 di chuyển con bọ chét Một ước tính thô của tỷ lệ ô trống là. , ngụ ý sự thay đổi của Monte -Carlo ước tính sau khi N lặp như vậy là khoảng 1 / N 1 / e ( 1 - 1 / e ) = 0,2325 ... / N1/eN1/N1/e(11/e)=0.2325/N. Để xác định câu trả lời đến sáu chữ số thập phân, bạn cần ước tính nó trong phạm vi 5.E-7 và, để đạt được độ tin cậy 95 +% (giả sử), bạn sẽ phải giảm một nửa độ chính xác đó xuống 2,5E-7 . Giải choN>4E12, xấp xỉ. Đó sẽ là khoảng 3.6E15 bọ chét di chuyển, mỗi lần lấy vài tích tắc của CPU. Với một CPU hiện đại có sẵn, bạn sẽ cần cả năm tính toán (hiệu quả cao). Và tôi đã phần nào không chính xác và quá mức giả định rằng câu trả lời được đưa ra theo tỷ lệ thay vì đếm: như một số đếm, nó sẽ cần ba con số quan trọng hơn, kéo theo sự gia tăng hàng triệu lần tính toán ... Bạn có thể đợi lâu không?)(0.2325/N)<2.5E7N>4E12

Theo như một giải pháp phân tích, một số đơn giản hóa có sẵn. (Chúng cũng có thể được sử dụng để rút ngắn tính toán Monte Carlo.) Số lượng ô trống dự kiến ​​là tổng xác suất của sự trống rỗng trên tất cả các ô. Để tìm điều này, bạn có thể tính toán phân phối xác suất số lượng chiếm dụng của từng ô. Những phân phối này có được bằng cách tổng hợp các đóng góp (độc lập!) Từ mỗi con bọ chét. Điều này giúp giảm vấn đề của bạn trong việc tìm số lượng đường dẫn có độ dài 50 dọc theo lưới 30 x 30 giữa bất kỳ cặp ô đã cho nào trên lưới đó (một là nguồn gốc của bọ chét và một ô khác là ô mà bạn muốn tính xác suất của bọ chét).


2
Chỉ để cho vui, tôi đã làm một phép tính vũ phu trong Mathicala. Câu trả lời của nó là tỷ lệ của số nguyên 21,574 chữ số với số nguyên 21,571 chữ số; dưới dạng thập phân, nó thoải mái gần 900 / e như mong đợi (nhưng, vì chúng tôi được yêu cầu không đăng giải pháp, tôi sẽ không cung cấp thêm thông tin chi tiết nào).
whuber

6

Bạn có thể không lặp lại thông qua xác suất chiếm đóng của các tế bào cho mỗi con bọ chét. Nghĩa là, flea k ban đầu nằm trong ô (i ​​(k), j (k)) với xác suất 1. Sau 1 lần lặp, anh ta có xác suất 1/4 trong mỗi 4 ô liền kề (giả sử anh ta không ở cạnh hoặc trong một góc). Sau đó, lần lặp lại tiếp theo, lần lượt từng khu vực đó được "bôi nhọ". Sau 50 lần lặp, bạn có một ma trận xác suất nghề nghiệp cho bọ chét k. Lặp lại trên tất cả 900 con bọ chét (nếu bạn tận dụng các đối xứng, điều này sẽ giảm gần 8 lần) và thêm xác suất (bạn không cần lưu trữ tất cả chúng cùng một lúc, chỉ là ma trận của bọ chét hiện tại (hmm, trừ khi bạn rất thông minh, bạn có thể muốn có một ma trận làm việc bổ sung) và tổng ma trận hiện tại). Đối với tôi có vẻ như có rất nhiều cách để tăng tốc độ này lên đây.

Điều này liên quan đến không có mô phỏng nào cả. Tuy nhiên, nó liên quan đến khá nhiều tính toán; không nên quá khó để tìm ra kích thước mô phỏng cần thiết để đưa ra câu trả lời có độ chính xác cao hơn 6 dp với xác suất cao và tìm ra cách tiếp cận nào sẽ nhanh hơn. Tôi hy vọng phương pháp này sẽ đánh bại mô phỏng bởi một số lề.


2
Việc bạn trả lời một câu hỏi hơi khác so với câu hỏi. Câu hỏi là hỏi số lượng ô dự kiến ​​sẽ trống sau 50 lần nhảy. Sửa lỗi cho tôi nếu tôi sai, nhưng tôi thấy không có con đường trực tiếp nào từ xác suất một con bọ chét kết thúc ở một hình vuông nhất định sau 50 lần nhảy để trả lời có bao nhiêu ô sẽ được dự kiến ​​sẽ trống.
Andy W

1
@Andy W - bình luận tuyệt vời; nhưng Monte Carlo có thể được sử dụng để thực hiện bước cuối cùng này ;-)

4
@Andy W: Thật ra, phần khó là nhận được tất cả những xác suất đó. Thay vì thêm chúng vào mỗi ô, hãy nhân số bổ sung của chúng: đó là xác suất ô sẽ trống. Tổng của các giá trị này trên tất cả các ô cho câu trả lời. Cách tiếp cận của Glen_b đánh bại mô phỏng theo bảy hoặc tám bậc độ lớn ;-).
whuber

@whuber, Cảm ơn đã giải thích. Thực sự có được những xác suất dưới một phút sẽ là thách thức. Đó là một câu đố thú vị và cảm ơn cho đầu vào của bạn.
Andy W

5

Mặc dù tôi không phản đối sự bất khả thi thực tế (hoặc không thực tế) của độ phân giải Monte Carlo của vấn đề này với độ chính xác là 6 chữ số thập phân được chỉ ra bởi whuber , tôi nghĩ rằng có thể đạt được độ phân giải có sáu chữ số chính xác.

t+1tK

K2

p^050(X(t))

p^0=1450i=1450I0(Xi(50))
(X(t))t=50π

i=1450(1πi)450
166.1069
pot=rep(c(rep(c(0,1),15),rep(c(1,0),15)),15)*c(2,
    rep(3,28),2,rep(c(3,rep(4,28),3),28),2,rep(3,28),2)
pot=pot/sum(pot)
sum((1-pot)^450)-450
[1] 166.1069

166.11

Theo nhận xét của whuber , các ước tính cần được nhân với 2 để trả lời chính xác câu hỏi, do đó giá trị cuối cùng là 332,2137,


1
+1 Rất sâu sắc. Tôi tin rằng bạn cần phải tăng gấp đôi câu trả lời cuối cùng của mình, vì câu hỏi hỏi về tất cả 900 ô.
whuber

1
Tôi tin rằng bạn có thể bắt đầu xa hơn từ phân phối cố định hơn bạn nghĩ. Các tính toán sức mạnh ban đầu tôi đã tính toán sức mạnh thứ 50 của ma trận chuyển tiếp bằng cách sử dụng số học chính xác (hợp lý). Từ đó tôi thu được giá trị 330.4725035083710 .... Có lẽ tôi đã làm một lỗi .... Tôi đã có một sai lầm và bây giờ có được 330.7211540144080 .... Kiểm tra mở rộng cho thấy ma trận chuyển tiếp là chính xác.
whuber

@whuber: Cảm ơn, đó thực sự là một khả năng. Tôi đã cố gắng tìm một đối số khớp nối để xác định tốc độ đến trạng thái đứng yên nhưng không thể. Một mô phỏng Monte Carlo với quy trình ban đầu đã cho tôi 333,96 trên 10⁶ bản sao và 57 giờ tính toán. Không có bảo hành thêm về độ chính xác.
Tây An

1
Đây là lý do của tôi. Ma trận chuyển tiếp cho 50 bước là sức mạnh thứ 50 của ma trận chuyển tiếp, từ đó các giá trị riêng của nó là sức mạnh thứ 50 của các giá trị riêng. Chỉ các hàm riêng tương ứng với các giá trị có sức mạnh thứ 50 có kích thước đáng kể mới xuất hiện dưới dạng các thành phần ở cuối 50 bước của bạn. Hơn nữa, các quyền lực thứ 50 đó thông báo cho chúng tôi về lỗi tương đối được thực hiện bằng cách dừng ở bước thứ 50 thay vì thực sự đạt được trạng thái ổn định.
whuber

1
900×900

4

Một cách tiếp cận phân tích có thể là tẻ nhạt và tôi đã không nghĩ qua những điều phức tạp nhưng đây là một cách tiếp cận mà bạn có thể muốn xem xét. Vì bạn quan tâm đến số lượng ô dự kiến ​​trống sau 50 vòng, bạn cần xác định chuỗi markov trên "Không có bọ chét trong một ô" thay vì vị trí của bọ chét (Xem câu trả lời của Glen_b mô hình vị trí của một con bọ chét như một chuỗi markov. Như Andy đã chỉ ra trong các bình luận cho câu trả lời đó, cách tiếp cận đó có thể không đạt được điều bạn muốn.)

Cụ thể, hãy:

nij(t)ij

Sau đó, chuỗi markov bắt đầu với trạng thái sau:

nij(0)=1ij

Vì bọ chét di chuyển đến một trong bốn ô liền kề, trạng thái của một ô thay đổi tùy thuộc vào số lượng bọ chét trong ô đích và có bao nhiêu con bọ chét trong bốn ô liền kề và xác suất chúng sẽ di chuyển đến ô đó. Sử dụng quan sát này, bạn có thể viết xác suất chuyển trạng thái cho mỗi ô dưới dạng hàm của trạng thái của ô đó và trạng thái của các ô liền kề.

Nếu bạn muốn tôi có thể mở rộng câu trả lời hơn nữa nhưng điều này cùng với phần giới thiệu cơ bản về chuỗi markov sẽ giúp bạn bắt đầu.


1
nij

@whuber Không, bạn không cần duy trì vị trí bọ chét như một chuỗi markov. Hãy nghĩ về những gì tôi đang đề xuất như một bước đi ngẫu nhiên cho một tế bào. Một ô ban đầu ở vị trí '1' từ đó nó có thể chuyển đến 0, 1, 2, 3, 4 hoặc 5. Xác suất chuyển trạng thái phụ thuộc vào trạng thái của các ô liền kề. Do đó, chuỗi đề xuất là một không gian trạng thái được xác định lại (số lượng ô cho mỗi ô) chứ không phải trên vị trí bọ chét. Điều đó có ý nghĩa?

1
Điều này có ý nghĩa, nhưng có vẻ như là một bước lùi, bởi vì số lượng trạng thái bây giờ lớn hơn nhiều? Trong một mô hình có 900 trạng thái - vị trí của một con bọ chét - và không quá bốn lần chuyển đổi khỏi mỗi trạng thái. Việc tính toán chỉ cần được thực hiện cho một con bọ chét vì tất cả chúng đều di chuyển độc lập. Trong bạn, có vẻ như một trạng thái được mô tả bởi sự chiếm chỗ của một tế bào cùng với sự chiếm chỗ của tối đa bốn người hàng xóm. Đó sẽ là một số lượng lớn các quốc gia và cũng là một số lượng rất lớn các chuyển đổi giữa các tiểu bang. Tôi phải hiểu nhầm không gian nhà nước mới của bạn là gì.
whuber

{nij}

2

nếu bạn định đi theo con đường số, một quan sát đơn giản: vấn đề dường như phải chịu sự tương đương đỏ-đen (một con bọ chét trên hình vuông màu đỏ luôn di chuyển đến hình vuông màu đen và ngược lại). Điều này có thể giúp giảm một nửa kích thước vấn đề của bạn (chỉ cần xem xét hai lần di chuyển cùng một lúc và chỉ nhìn vào bọ chét trên các ô vuông màu đỏ, nói.)


1
Đó là một quan sát tốt đẹp. Tuy nhiên, tôi thấy phiền hơn là đáng để khai thác điều này một cách rõ ràng. Hầu hết số tiền lập trình để thiết lập ma trận chuyển tiếp. Một khi bạn làm điều đó, chỉ cần vuông nó và làm việc với điều đó. Bằng cách sử dụng ma trận thưa thớt, loại bỏ một nửa số không sẽ không tiết kiệm được thời gian nào.
whuber

@whuber: Tôi nghi ngờ điểm của những vấn đề này là học các kỹ thuật giải quyết vấn đề, thay vì tiêu thụ nhiều chu kỳ tính toán. Đối xứng, ngang giá, v.v., là những kỹ thuật cổ điển từ cuốn sách của Larson về giải quyết vấn đề.
shabbychef

1
Đó là một điểm hay. Cuối cùng một số đánh giá là cần thiết. Project Euler dường như nhấn mạnh sự đánh đổi giữa cái nhìn sâu sắc toán học và hiệu quả tính toán. Glen_b đã đề cập đến các đối xứng đáng được khai thác trước tiên vì có nhiều hơn để đạt được từ chúng. Hơn nữa, bằng cách sử dụng số học ma trận thưa thớt, bạn sẽ tự động đạt được mức tăng gấp đôi (cho dù bạn có biết về tính chẵn lẻ hay không!).
whuber

1

Tôi nghi ngờ rằng một số kiến ​​thức về chuỗi Markov thời gian rời rạc có thể chứng minh hữu ích.


3
Điều này đáng lẽ phải là một bình luận, nhưng tôi nghĩ chúng ta có thể đưa nó vào thời điểm này.
gung - Phục hồi Monica

Điều này đang được tự động gắn cờ là chất lượng thấp, có lẽ vì nó quá ngắn. Bạn có thể mở rộng về nó?
gung - Phục hồi Monica

Tôi không hiểu tại sao: câu hỏi yêu cầu các chủ đề có thể hữu ích và đây là chủ đề mà theo tôi là phù hợp nhất.
Simon Byrne

1
Điều này đã được gắn cờ là chất lượng thấp . Tôi đã bình chọn rằng nó ổn. Nếu bạn nhìn vào các câu trả lời khác cho chủ đề này, tất cả chúng đều dài hơn đáng kể. Các tiêu chuẩn đã phát triển theo thời gian, nhưng ngày nay, đây sẽ được coi là một nhận xét, ngay cả khi đề cập đến một "chủ đề có thể hữu ích". Như tôi đã nói, tôi nghĩ rằng điều này có thể được ông nội như vậy. Cho dù bạn cố gắng để mở rộng nó là tùy thuộc vào bạn. Tôi chỉ cho bạn biết.
gung - Phục hồi Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.