Bagaimana seharusnya seseorang menyetujui masalah Project Euler 213 ("Flea Circus")?


11

Saya ingin menyelesaikan Project Euler 213 tetapi tidak tahu harus mulai dari mana karena saya orang awam di bidang Statistik, perhatikan bahwa jawaban yang akurat diperlukan agar metode Monte Carlo tidak akan berfungsi. Bisakah Anda merekomendasikan beberapa topik statistik untuk saya baca? Tolong jangan posting solusinya di sini.

Kutu Sirkus

Kisi kotak 30 × 30 berisi 900 kutu, awalnya satu kutu per kotak. Ketika bel berbunyi, setiap kutu melompat ke kotak yang berdekatan secara acak (biasanya 4 kemungkinan, kecuali untuk kutu di tepi kisi atau di sudut).

Berapakah jumlah kotak kosong yang diharapkan setelah 50 dering bel? Berikan jawaban Anda dibulatkan ke enam tempat desimal.


7
Metode Monte Carlo dapat memberikan jawaban yang sangat akurat asalkan Anda melakukan simulasi yang cukup.
Rob Hyndman

3
Jika Anda menginginkan solusi pemrograman, monte carlo adalah satu-satunya pendekatan. Saya tidak melihat alasan mengapa Anda tidak akan mendapatkan jawaban yang akurat menggunakan monte carlo. Solusi matematis / analitis mungkin tidak mudah.

Saya telah melihat diskusi tentang Monte Carlo dan orang-orang mengatakan jika Anda ingin mencapai 6 tempat desimal, itu akan terlalu lama, atau mungkin saya bingung dengan masalah serupa lainnya. Karena cukup mudah untuk membuat kode pendekatan Monte Carlo, saya kira akan bermanfaat untuk mencobanya terlebih dahulu.
grokus

4
Saya tidak membantah salah satu dari tiga jawaban sebelumnya, tetapi analisis (sederhana) dalam jawaban yang saya tawarkan menempatkan pernyataan ini dalam perspektif: jika Anda ingin akurasi tempat desimal enam untuk perkiraan angka yang akan berjumlah ratusan, simulasi Monte Carlo akan memakan waktu setidaknya satu tahun pada mesin dengan 10.000 CPU yang berjalan secara paralel.
whuber

Apakah semua kutu terjebak (mis. Masalahnya adalah tentang kotak dengan lebih dari satu kutu) atau apakah ini tentang kutu di tepi yang melompat keluar dan menghilang?
MissMonicaE

Jawaban:


10

Kamu benar; Monte Carlo tidak praktis. (Dalam simulasi naif - yaitu, yang persis mereproduksi situasi masalah tanpa penyederhanaan apapun - setiap iterasi akan melibatkan 900 gerakan kutu. Perkiraan kasar proporsi sel kosong adalah , menyiratkan varian dari Monte Perkiraan -Carlo setelah iterasi tersebut kira-kira Untuk menjabarkan jawaban ke enam tempat desimal, Anda harus memperkirakannya dalam 5.E. -7 dan, untuk mencapai kepercayaan 95 +% (katakanlah), Anda harus membagi dua presisi itu menjadi 2,5E-7. Memecahkan memberiN 1 / N 1 / e ( 1 - 1 / e ) = 0,2325 / N 1/eN1/N1/e(11/e)=0.2325/NN>4E12(0.2325/N)<2.5E7N>4E12kira-kira. Itu akan menjadi sekitar 3,6E15 gerakan kutu, masing-masing mengambil beberapa kutu CPU. Dengan satu CPU modern yang tersedia, Anda akan membutuhkan komputasi (sangat efisien) setahun penuh. Dan saya agak salah dan terlalu optimis mengasumsikan jawaban diberikan sebagai proporsi alih-alih hitungan: sebagai penghitungan, itu akan membutuhkan tiga angka yang lebih signifikan, yang melibatkan peningkatan satu juta kali lipat dalam perhitungan ... Bisakah Anda menunggu lama?)

Sejauh solusi analitis berjalan, beberapa penyederhanaan tersedia. (Ini juga dapat digunakan untuk mempersingkat perhitungan Monte Carlo.) Jumlah sel kosong yang diharapkan adalah jumlah probabilitas kekosongan atas semua sel. Untuk menemukan ini, Anda bisa menghitung distribusi probabilitas angka hunian setiap sel. Distribusi tersebut diperoleh dengan menjumlahkan kontribusi (independen!) Dari setiap kutu. Ini mengurangi masalah Anda untuk menemukan jumlah jalur panjang 50 sepanjang 30 dengan 30 kisi antara setiap pasangan sel pada kisi itu (satu adalah asal kutu dan satunya lagi adalah sel yang ingin Anda hitung probabilitas dari hunian kutu).


2
Hanya untuk bersenang-senang, saya melakukan perhitungan brute-force di Mathematica. Jawabannya adalah rasio bilangan bulat 21,574 digit ke bilangan bulat 21,571 digit; sebagai desimal nyaman mendekati 900 / e seperti yang diharapkan (tapi, karena kami diminta untuk tidak mengirim solusi, saya tidak akan memberikan rincian lebih lanjut).
whuber

6

Bisakah Anda tidak mengulangi melalui probabilitas pendudukan sel untuk setiap kutu. Artinya, kutu awalnya dalam sel (i (k), j (k)) dengan probabilitas 1. Setelah 1 iterasi, ia memiliki probabilitas 1/4 di masing-masing 4 sel yang berdekatan (dengan asumsi ia tidak berada di tepi atau di sebuah sudut). Kemudian iterasi berikutnya, masing-masing tempat itu akan "dioleskan" pada gilirannya. Setelah 50 iterasi Anda memiliki matriks probabilitas pekerjaan untuk kutu. Ulangi lebih dari 900 kutu (jika Anda mengambil keuntungan dari simetri ini mengurangi hampir faktor 8) dan menambahkan probabilitas (Anda tidak perlu menyimpan semuanya sekaligus, hanya matriks kutu saat ini (hmm, kecuali Anda sangat pintar, Anda mungkin ingin matriks kerja tambahan) dan jumlah matriks saat ini). Menurut saya ada banyak cara untuk mempercepat ini di sana-sini.

Ini tidak melibatkan simulasi sama sekali. Namun, itu memang melibatkan cukup banyak perhitungan; seharusnya tidak terlalu sulit untuk menentukan ukuran simulasi yang diperlukan untuk memberikan jawaban yang lebih baik daripada akurasi 6 dp dengan probabilitas tinggi dan mencari tahu pendekatan mana yang akan lebih cepat. Saya berharap pendekatan ini akan mengalahkan simulasi dengan beberapa margin.


2
Anda menjawab pertanyaan yang sedikit berbeda dari pertanyaan yang diajukan. Pertanyaannya adalah menanyakan jumlah sel yang diharapkan yang akan kosong setelah 50 melompat. Koreksi saya jika saya salah, tetapi saya tidak melihat jalur langsung dari kemungkinan kutu berakhir di kotak tertentu setelah 50 melompat ke jawaban berapa banyak sel yang diharapkan kosong.
Andy W

1
@Andy W - komentar bagus; namun Monte Carlo dapat digunakan untuk melakukan langkah terakhir ini ;-)

4
@Andy W: Sebenarnya, bagian yang sulit adalah mendapatkan semua probabilitas itu. Alih-alih menambahkannya di setiap sel, gandakan pelengkap mereka: itulah kemungkinan sel akan kosong. Jumlah nilai-nilai ini di atas semua sel memberikan jawabannya. Pendekatan Glen_b mengalahkan simulasi dengan tujuh atau delapan urutan besarnya ;-).
whuber

@whuber, Terima kasih atas penjelasannya. Memang mendapatkan probabilitas tersebut dalam waktu kurang dari satu menit akan menjadi tantangan. Ini adalah teka-teki yang menyenangkan dan terima kasih atas masukan Anda.
Andy W

5

Sementara saya tidak keberatan dengan ketidakmungkinan praktis (atau ketidakpraktisan) dari resolusi Monte Carlo masalah ini dengan ketepatan 6 tempat desimal yang ditunjukkan oleh whuber , saya akan berpikir resolusi dengan enam digit akurasi dapat dicapai.

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

Seperti dikomentari oleh whuber , estimasi harus dikalikan dengan 2 untuk menjawab pertanyaan dengan benar, sehingga nilai akhir 332.2137,


1
+1 Sangat berwawasan luas. Saya yakin Anda perlu menggandakan jawaban akhir Anda, karena pertanyaannya adalah 900 sel.
whuber

1
Saya percaya Anda mungkin mulai lebih jauh dari distribusi stasioner daripada yang Anda pikirkan. Perhitungan brute-force yang saya lakukan pada awalnya menghitung kekuatan ke-50 dari matriks transisi menggunakan aritmatika (rasional) yang tepat. Dari situ saya memperoleh nilai 330.4725035083710 .... Mungkin saya membuat kesalahan .... Saya memang memiliki kesalahan dan sekarang mendapatkan 330,7211540144080 .... Pengecekan ekstensif menunjukkan matriks transisi sudah benar.
whuber

@whuber: Terima kasih, ini memang kemungkinan. Saya mencoba menemukan argumen penggandengan untuk menentukan kecepatan ke stasioneritas tetapi tidak bisa. Simulasi Monte Carlo dengan proses asli memberi saya 333,96 lebih dari 10⁶ replika dan 57 jam perhitungan. Tanpa jaminan lebih lanjut tentang presisi.
Xi'an

1
Inilah alasan saya. Matriks transisi untuk 50 langkah adalah kekuatan ke-50 dari matriks transisi, di mana nilai eigennya adalah kekuatan ke-50 dari nilai eigen. Hanya vektor eigen yang sesuai dengan nilai yang kekuatan ke-50-nya dengan ukuran yang cukup besar akan muncul sebagai komponen di akhir 50 langkah Anda. Terlebih lagi, kekuatan ke-50 itu memberi tahu kami tentang kesalahan relatif yang dibuat dengan berhenti pada langkah ke-50 daripada benar-benar mencapai kondisi mapan.
Whuber

1
900×900

4

Suatu pendekatan analitis mungkin membosankan dan saya belum memikirkan seluk-beluknya tetapi inilah pendekatan yang mungkin ingin Anda pertimbangkan. Karena Anda tertarik pada jumlah sel yang diharapkan yang kosong setelah 50 cincin, Anda perlu menentukan rantai markov di atas "Tidak ada kutu dalam sel" daripada posisi kutu (Lihat jawaban Glen_b yang memodelkan posisi kutu sebagai rantai markov. Seperti yang ditunjukkan oleh Andy dalam komentar untuk jawaban itu bahwa pendekatan mungkin tidak mendapatkan apa yang Anda inginkan.)

Secara khusus, biarkan:

nij(t)ij

Kemudian rantai markov dimulai dengan status berikut:

nij(0)=1ij

Karena, kutu pindah ke salah satu dari empat sel yang berdekatan, keadaan sel berubah tergantung pada berapa banyak kutu di dalam sel target dan berapa banyak kutu yang ada di empat sel yang berdekatan dan probabilitas bahwa mereka akan pindah ke sel itu. Dengan menggunakan pengamatan ini, Anda dapat menulis probabilitas transisi keadaan untuk setiap sel sebagai fungsi dari keadaan sel itu dan keadaan sel yang berdekatan.

Jika Anda mau, saya bisa memperluas jawabannya lebih lanjut tetapi ini bersama dengan pengantar dasar untuk rantai markov harus membantu Anda memulai.


1
nij

@whuber Tidak, Anda tidak perlu mempertahankan posisi kutu sebagai rantai markov. Pikirkan apa yang saya usulkan sebagai jalan acak untuk sebuah sel. Sel awalnya berada pada posisi '1' dari mana ia bisa pergi ke 0, 1, 2, 3, 4, atau 5. Probabilitas transisi keadaan tergantung pada keadaan sel yang berdekatan. Dengan demikian, rantai yang diusulkan adalah pada ruang keadaan yang didefinisikan ulang (jumlah sel untuk setiap sel) daripada pada posisi kutu itu sendiri. Apakah itu masuk akal?

1
Masuk akal, tetapi sepertinya ini adalah langkah mundur, karena bukankah jumlah negara sekarang jauh lebih besar? Dalam satu model ada 900 negara - posisi kutu tunggal - dan tidak lebih dari empat transisi dari masing-masing. Perhitungan hanya perlu dilakukan untuk satu kutu karena mereka semua bergerak secara independen. Di negara Anda, tampaknya keadaan dijelaskan oleh hunian sel bersama dengan hunian hingga empat tetangga. Itu akan menjadi jumlah negara yang sangat besar dan juga jumlah transisi yang sangat besar di antara negara-negara bagian. Saya pasti salah paham tentang apa ruang negara baru Anda.
whuber

{nij}

2

jika Anda akan pergi ke rute numerik, pengamatan sederhana: masalah tampaknya tunduk pada paritas merah-hitam (kutu di kotak merah selalu bergerak ke kotak hitam, dan sebaliknya). Ini dapat membantu mengurangi ukuran masalah Anda menjadi setengah (pertimbangkan saja dua gerakan pada satu waktu, dan hanya lihat kutu di kotak merah, katakanlah.)


1
Itu pengamatan yang bagus. Namun, saya merasa lebih repot daripada layak mengeksploitasi ini secara eksplisit. Sebagian besar jumlah pemrograman untuk menyiapkan matriks transisi. Setelah Anda melakukannya, cukup persegi dan bekerja dengan itu. Dengan menggunakan matriks jarang, menghapus setengah nol tidak menghemat waktu.
whuber

@whuber: Saya menduga inti dari masalah ini adalah untuk mempelajari teknik pemecahan masalah, daripada mengkonsumsi banyak siklus komputasi. Simetri, paritas, dll, adalah teknik klasik dari buku Larson tentang pemecahan masalah.
shabbychef

1
Itu poin yang bagus. Pada akhirnya diperlukan penilaian. Project Euler tampaknya menekankan pertukaran antara wawasan matematika dan efisiensi komputasi. Glen_b menyebutkan simetri yang layak dieksploitasi terlebih dahulu karena ada lebih banyak yang bisa diperoleh dari mereka. Selain itu, dengan menggunakan aritmatika matriks jarang, Anda akan mencapai gain dua kali lipat secara otomatis (baik Anda mengetahui paritasnya atau tidak!).
whuber

1

Saya menduga bahwa beberapa pengetahuan tentang rantai Markov waktu diskrit terbukti bermanfaat.


3
Ini seharusnya menjadi komentar, tapi saya pikir kita bisa melakukannya pada saat ini.
gung - Reinstate Monica

Ini ditandai secara otomatis sebagai kualitas rendah, mungkin karena sangat pendek. Bisakah Anda mengembangkannya?
gung - Reinstate Monica

Saya tidak mengerti mengapa: pertanyaannya menanyakan topik yang mungkin berguna, dan ini adalah topik yang menurut saya paling relevan.
Simon Byrne

1
Ini ditandai sebagai kualitas rendah . Saya memilih bahwa itu tidak masalah. Jika Anda melihat jawaban lain untuk utas ini, semuanya jauh lebih lama. Standar telah berkembang dari waktu ke waktu, tetapi hari ini, ini akan dianggap sebagai komentar, bahkan jika menyebutkan "topik yang mungkin berguna". Seperti yang saya katakan, saya pikir ini bisa seperti kakek. Apakah Anda mencoba mengembangkannya, itu terserah Anda. Aku baru saja memberitahumu.
gung - Reinstate Monica
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.