Project Euler problemi 213'e (“Pire Sirki”) nasıl yaklaşılmalıdır?


11

Project Euler 213'ü çözmek istiyorum, ancak nereden başlayacağımı bilmiyorum çünkü İstatistik alanında uzmanım, Monte Carlo yönteminin işe yaramayacağı için doğru bir yanıtın gerekli olduğuna dikkat edin. Okumam gereken bazı istatistik konularını önerebilir misiniz? Lütfen çözümü buraya göndermeyin.

Pire sirki

30 × 30 karelik ızgara, başlangıçta kare başına bir pire olmak üzere 900 pire içerir. Bir zil çalındığında, her pire rastgele bitişik bir kareye atlar (ızgaranın kenarındaki veya köşelerindeki pire hariç genellikle 4 olasılık).

Zilin 50 halkasından sonra boş kalan kare sayısı nedir? Cevabınızı altı ondalık basamağa yuvarlayın.


7
Monte Carlo yöntemleri, yeterince simülasyon yapmanız koşuluyla çok doğru cevaplar verebilir.
Rob Hyndman

3
Bir programlama çözümü istiyorsanız, monte edilmiş bir carlo tek yaklaşımdır. Monte carlo kullanarak doğru cevaplar almamanın bir nedeni görmüyorum. Matematiksel / analitik bir çözüm kolay olmayabilir.

Monte Carlo hakkında tartışma gördüm ve insanlar 6 ondalık basamağa ulaşmak istiyorsanız, çok uzun süreceğini veya belki de benzer problemlerle karıştığımı söyledi. Monte Carlo yaklaşımını kodlamak oldukça kolay olduğu için, ilk önce denemeye değer.
grokus

4
Önceki üç cevabın hiçbirine itiraz etmiyorum, ancak sunduğum cevaptaki (basit) analiz bu açıklamaları perspektife koyuyor: yüzlerce sayı olacak bir sayının tahmini için altı ondalık basamak doğruluğu istiyorsanız, Monte Carlo simülasyonu, paralel olarak 10.000 CPU çalışan bir makinede en az bir yıl sürecektir.
whuber

Tüm pire sıkışmış mı (yani sorun gerçekten üzerinde birden fazla pire bulunan karelerle ilgili) veya bu kenarlardaki pire atlamalı ve kayboluyor mu?
MissMonicaE

Yanıtlar:


10

Haklısın; Monte Carlo uygulanamaz. (Saf bir simülasyonunda - olan, tam olarak bir basitleştirmeler olmadan problem durumunu üretir bir - her bir tekrar 900 pire hareket içerecektir bir boş hücrelerin oranının ham tahmindir. , Monte varyansı ima sonra -Carlo tahmin K gibi tekrarlamalar yaklaşık 1 / N 1 / e ( 1 - 1 / e ) = 0,2325 ... / K1/eN-1/N-1/e(1-1/e)=0,2325.../N-. Cevabı altı ondalık basamağa sabitlemek için, 5.E-7 içinde tahmin etmeniz gerekir ve% 95 + (örneğin) güvenini elde etmek için, bu hassasiyeti yaklaşık 2.5E-7'ye yarıya indirmeniz gerekir. . Çözme verirN>4E12, yaklaşık. Bu 3.6E15 pire hamle, her biri birkaç CPU kenarı alır. Mevcut tek bir modern CPU ile tam bir yıl (yüksek verimli) bilgi işlem gerekir. Ve bir şekilde yanlış ve aşırı derecede geçici olarak yanıtın bir sayı yerine bir oran olarak verildiğini varsaydım: bir sayı olarak, hesaplamada bir milyon kat artış gerektiren üç daha önemli rakama ihtiyaç duyacağım ... Uzun süre bekleyebilir misiniz?)(0,2325/N-)<2.5E-7N->4E12

Analitik bir çözüm söz konusu olduğunda, bazı basitleştirmeler mevcuttur. (Bunlar bir Monte Carlo hesaplamasını kısaltmak için de kullanılabilir.) Beklenen boş hücre sayısı, tüm hücreler üzerindeki boşluk olasılığının toplamıdır. Bunu bulmak için, her bir hücrenin doluluk oranlarının olasılık dağılımını hesaplayabilirsiniz. Bu dağılımlar her pire (bağımsız!) Katkıları toplanarak elde edilir. Bu, söz konusu ızgaradaki herhangi bir çift hücre arasında 30 x 30 ızgara boyunca uzunluk 50'nin yol sayısını bulma sorununuzu azaltır (biri pire kökenli ve diğeri de bunun olasılığını hesaplamak istediğiniz bir hücredir pire doluluk).


2
Sadece eğlence için, Mathematica'da kaba kuvvet hesaplaması yaptım. Cevabı 21.574 basamaklı bir tamsayının 21.571 basamaklı bir tamsayıya oranıdır; ondalık olarak rahatça beklendiği gibi 900 / e'ye yakındır (ancak bir çözüm göndermememiz istendiğinden daha fazla ayrıntı vermeyeceğim).
whuber

6

Her pire için hücrelerin işgal olasılığı ile tekrarlayamazdınız. Yani, pire k başlangıçta olasılık 1 ile hücre (i (k), j (k)) 'dedır. 1 tekrardan sonra, bitişik 4 hücrenin her birinde 1/4 olasılığı vardır (bir kenarda veya içinde olmadığı varsayılarak) bir köşe). Sonra bir sonraki yineleme, bu mahallelerin her biri sırayla "bulaşır". 50 iterasyondan sonra pire için meslek olasılık matrisine sahipsiniz. Tüm 900 pire boyunca tekrarlayın (simetrilerden faydalanırsanız, bu neredeyse 8 kat azalır) ve olasılıkları ekleyin (hepsini bir kerede saklamanız gerekmez, sadece geçerli pire matrisi (hmm, çok zekice, ek bir çalışma matrisi isteyebilirsiniz) ve matrislerin mevcut toplamı). Bana bunu burada ve orada hızlandırmanın birçok yolu varmış gibi geliyor.

Bu hiçbir simülasyon içermez. Ancak, oldukça fazla hesaplama içerir; cevapları yüksek olasılıkla 6 dp doğruluktan biraz daha iyi vermek için gereken simülasyon boyutunu çalışmak ve hangi yaklaşımın daha hızlı olacağını bulmak çok zor olmamalıdır. Bu yaklaşımın simülasyonu biraz marjla geçeceğini umuyorum.


2
Yanıtınız, sorudan biraz farklı bir soruyu cevaplıyor. Soru, 50 sıçramadan sonra boş olması beklenen hücre sayısını sormaktır. Yanılıyorsam beni düzeltin, ancak 50 atlamadan sonra bir pire belirli bir karede bitmesi olasılığından, kaç hücrenin boş olması beklenir diye doğrudan bir yol görmüyorum.
Andy W

1
@Andy W - harika yorum; henüz Monte Carlo bu son adımı yapmak için kullanılabilir ;-)

4
@Andy W: Aslında zor kısım tüm olasılıkları elde ediyordu. Her hücreye eklemek yerine, tamamlayıcılarını çoğaltın: bu, hücrenin boş olma olasılığıdır. Bu değerlerin tüm hücreler üzerindeki toplamı cevabı verir. Glen_b'in yaklaşımı, simülasyonu yedi veya sekiz büyüklükte ;-) yener.
whuber

@whuber, Açıklama için teşekkürler. Gerçekten de bu olasılıkları bir dakikadan az bir sürede elde etmek zor olabilir. Eğlenceli bir bulmaca ve girişiniz için teşekkürler.
Andy W

5

Bu problemin Monte Carlo çözümünün whuber tarafından işaret edilen 6 ondalık basamak hassasiyetiyle pratik imkansızlığına (veya pratikliğine) itiraz etmememe rağmen , altı basamaklı doğrulukla bir çözümün elde edilebileceğini düşünüyorum.

İlk olarak, şu Glen_b , parçacıklar dolayısıyla (deki gibi yeterli bir sabit rejimde değiştirilebilir olan yeterliliği bu da Markov işlemi teşkil gibi farklı hücre doluluk izlemek için). Bir sonraki basamağında yolcuların dağılımı , şu anki t zamanındaki işgalciler tarafından belirlenir . Geçiş matrisini K yazmak kesinlikle pratik değildir, ancak geçişi simüle etmek kolaydır.t+1tK

İkincisi, shabbychef tarafından belirtildiği gibi , sadece çift zamanlar, yani kare Markov matrisi , tek kare üzerinde kalan 450 tek (veya çift) karede doluluk sürecini takip edebilir .K2

Üçüncü olarak, Asıl problem, sıfır sıklığını dikkate p 0 sonra, 50 Markov geçişler. Başlangıç noktası Markov zincirinin sabit olasılık dağılımı için çok yüksek bir değere sahip olduğu göz önüne alındığında, ( x ( t ) ) ve verilen tüm hücreler boyunca tek bir ortalama, odak p 0 = 1p^050(X(t))t=50zamanındazincirin(X(t))gerçekleşmesinin sabit olasılık dağılımından bir gerçekleşmeolduğunu düşünebiliriz. Bu, doğrudanköşedeki 2, 3 ve 4, kenardaki diğer hücreler ve iç hücrelerle orantılı olasılıkları olan çok terimli bir dağılım olanbu sabit dağıtımdanπdoğrudan simüle edebileceğimiz için hesaplama maliyetinde önemli bir azalma sağlar., sırasıyla.

p^0=1450Σben=1450ben0(Xben(50))
(X(t))t=50π

Açıkça görülüyor ki, durağan dağılım, beklenen boş hücre sayısını, 450.107'ye eşit olarak doğrudan sağlar .

Σben=1450(1-πben)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

Bu, bir Monte Carlo yaklaşımına oldukça yakındır ( makinemde 14 saat süren 10⁸ simülasyonlarına dayanarak). Ama 6 ondalık sayı için yeterince yakın değil.166,11

Whuber tarafından yorumlandığı gibi , soruyu doğru cevaplamak için tahminlerin 2 ile çarpılması gerekir, bu nedenle 332.2137 nihai değeri,


1
+1 Çok anlayışlı. Son cevabınızı ikiye katlamanız gerektiğine inanıyorum, çünkü soru 900 hücrenin tamamını soruyor.
whuber

1
Sabit dağıtımdan sandığınızdan daha fazla başlayabileceğinize inanıyorum. Başlangıçta yaptığım kaba kuvvet hesaplamaları, kesin (rasyonel) aritmetik kullanarak geçiş matrisinin 50. gücünü hesapladı. Ondan 330.4725035083710 ... bir değer elde ettim. Belki bir hata yaptım ..... Bir hata yaptım ve şimdi 330.7211540144080 olsun .... Kapsamlı kontrol geçiş matrisinin doğru olduğunu gösteriyor.
whuber

@whuber: Teşekkürler, gerçekten de bir olasılık. Durağanlık hızını belirlemek için bir bağlantı argümanı bulmaya çalıştım ama yapamadım. Orijinal süreç ile bir Monte Carlo simülasyonu bana 10⁶ kopyaları üzerinde 333.96 ve 57 saat hesaplama verdi. Kesinlik konusunda başka garanti verilmeksizin.
Xi'an

1
İşte benim mantığım. 50 adım için geçiş matrisi, geçiş matrisinin 50. gücüdür, bu nedenle özdeğerleri, özdeğerlerin 50. güçleridir. Sadece 50. gücü kayda değer boyutta olan değerlere karşılık gelen özvektörler, 50 adımınızın sonunda bileşenler olarak görünecektir. Dahası, bu 50. güçler, gerçekte sabit bir duruma ulaşmak yerine 50. adımda durdurarak yapılan göreceli hata hakkında bizi bilgilendirir.
whuber

1
900x900

4

Analitik bir yaklaşım can sıkıcı olabilir ve karmaşıklıkları düşünmedim ama işte düşünmek isteyebileceğiniz bir yaklaşım. Eğer 50 çaldıktan sonra boş hücrelerinin beklenen sayısı ilgilenen olduğundan siz "bir hücrede pirelerin No" yerine pire konumu üzerinde (Bkz Glen_b en bir Markov zinciri tanımlamak için gerekmez cevabı hangi modelleri pozisyonu markov zinciri olarak bir pire. Andy'nin bu cevaba yaptığı yorumlarda belirtildiği gibi, bu yaklaşım istediğinizi elde edemeyebilir.)

Özellikle:

nbenj(t)benj

Daha sonra markov zinciri aşağıdaki durumla başlar:

nij(0)=1ij

Pireler dört bitişik hücreden birine hareket ettiğinden, bir hücrenin durumu hedef hücrede kaç pire olduğuna ve bitişik dört hücrede kaç pire bulunduğuna ve bu hücreye hareket etme olasılığına bağlı olarak değişir. Bu gözlemi kullanarak, her hücrenin durum geçiş olasılıklarını o hücrenin ve bitişik hücrelerin durumunun bir fonksiyonu olarak yazabilirsiniz.

İsterseniz cevabı daha da genişletebilirim, ancak bu markov zincirlerine temel bir giriş ile birlikte başlamanız gerekir.


1
nij

@whuber Hayır, bir markov zinciri olarak pire pozisyonunu korumanıza gerek yok. Ne önerdiğimi bir hücre için rastgele bir yürüyüş olarak düşünün. Bir hücre başlangıçta '1' pozisyonundadır, buradan 0, 1, 2, 3, 4 veya 5'e gidebilir. Durum geçiş olasılığı, bitişik hücrelerin durumuna bağlıdır. Dolayısıyla, önerilen zincir pire pozisyonunun kendisinden ziyade yeniden tanımlanmış bir durum uzayındadır (her hücre için hücre sayıları). bu mantıklı mı?

1
Bu mantıklı, ama geriye doğru bir adım gibi görünüyor, çünkü şimdi devlet sayısı çok daha fazla değil mi? Bir modelde 900 devlet vardır - tek bir pire konumu - ve her birinden en fazla dört geçiş. Hesaplamanın tek bir pire için yapılması gerekir, çünkü hepsi bağımsız olarak hareket eder. Sizinkinde, bir devlet, dört komşusuna kadar bir hücrenin doluluk oranı ile tanımlanmıştır. Bu son derece çok sayıda devlet ve aynı zamanda çok sayıda devlet arasında geçişler olacaktır. Yeni eyalet alanınızın ne olduğunu yanlış anlamalıyım.
whuber

{nij}

2

sayısal rotaya gidecekseniz, basit bir gözlem: sorun kırmızı-siyah pariteye tabi görünüyor (kırmızı bir kare üzerindeki bir pire her zaman siyah bir kareye gider ve tam tersi). Bu, sorun boyutunuzu yarıya indirmenize yardımcı olabilir (bir kerede iki hamleyi düşünün ve sadece kırmızı karelerdeki pire bakın, diyelim.)


1
Bu güzel bir gözlem. Ancak, bunu açıkça sömürmeye değer olmaktan daha rahatsız edici buldum. Programlamaların çoğu geçiş matrisini ayarlamak demektir. Bunu yaptıktan sonra, kare yapın ve onunla çalışın. Seyrek matrisler kullanarak sıfırların yarısının kaldırılması hiçbir zaman zaman kazandırmaz.
whuber

@whuber: Bu sorunların amacının, çok sayıda hesaplama döngüsü kullanmak yerine problem çözme tekniklerini öğrenmek olduğundan şüpheleniyorum. Simetri, parite, vb.Lsonson'un problem çözme kitabından klasik tekniklerdir.
shabbychef

1
İyi bir noktaya değindin. Sonuçta bazı yargılara ihtiyaç vardır. Euler Projesi, matematiksel içgörü ile hesaplama verimliliği arasındaki değişimleri vurgulamaktadır. Glen_b ilk önce sömürülmeye değer simetrilerden bahsetti çünkü onlardan kazanılacak daha çok şey var. Dahası, seyrek matris aritmetiği kullanarak iki kat kazancı otomatik olarak elde edersiniz (paritenin farkında olsun veya olmasın!).
whuber

1

Ayrık zamanlı Markov zincirleri hakkındaki bazı bilgilerin yararlı olabileceğinden şüpheleniyorum .


3
Bu bir yorum olmalıydı, ama sanırım bu noktada bunu dinebiliriz.
gung - Monica'yı eski

Bu, muhtemelen çok kısa olduğu için otomatik olarak düşük kalite olarak işaretleniyor. Üzerine genişleyebilir misin?
gung - Monica'yı eski

Nedenini göremiyorum: soru faydalı olabilecek konuları soruyor ve bence en alakalı olan konu bu.
Simon Byrne

1
Bu düşük kalite olarak işaretlendi . Tamam olduğuna oy verdim. Bu konuya verilen diğer cevaplara bakarsanız, hepsi çok daha uzundur. Standartlar zaman içinde gelişti, ancak bugün, "yararlı olabilecek bir konu" dan bahsedilse bile, bu bir yorum olarak değerlendirilecektir. Dediğim gibi, bunun olduğu gibi dedesi olabileceğini düşündüm. Genişletmeye çalışıp çalışmadığınız size bağlıdır. Sadece sana haber veriyordum.
gung - Monica'yı eski
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.