Як слід визначити проблему проекту 213 Проекту Ейлера ("Блошиний цирк")?


11

Я хотів би вирішити Project Euler 213, але не знаю, з чого почати, тому що я лайпер в галузі статистики, зауважте, що потрібна точна відповідь, щоб метод Монте-Карло не працював. Чи можете ви порекомендувати деякі теми статистики для мене для читання? Будь ласка, не публікуйте рішення тут.

Цифровий цирк

Сітка квадратів розміром 30 × 30 містить 900 бліх, спочатку одна блоха на квадрат. Коли лунає дзвіночок, кожна блоха стрибає навпроти сусіднього квадрата (як правило, 4 можливості, за винятком бліх на краю сітки або на кутах).

Яка очікувана кількість незайнятих квадратів після 50 кілець дзвону? Дайте відповідь округленою до шести знаків після коми.


7
Методи Монте-Карло можуть дати дуже точні відповіді, якщо ви зробите достатньо симуляцій.
Роб Хайндман

3
Якщо ви хочете вирішити програмування, єдиний підхід - це monte carlo. Я не бачу жодної причини, чому ви не отримаєте точних відповідей, використовуючи monte carlo. Математичне / аналітичне рішення може бути непростим.

Я бачив дискусію про Монте-Карло, і люди сказали, що якщо ви хочете досягти 6 знаків після коми, це займе занадто довго, або, можливо, я плутаюся з іншими подібними проблемами. Оскільки кодувати підхід Монте-Карло досить просто, я думаю, варто спробувати спершу спробувати.
grokus

4
Я не заперечую жодної з трьох попередніх відповідей, але (простий) аналіз відповіді, яку я запропонував, ставить ці зауваження в перспективу: якщо ви хочете, щоб шість знаків після десяткового знаку оцінили число, яке буде в сотні, моделювання в Монте-Карло займе щонайменше рік на машині, де паралельно працює 10 000 процесорів.
whuber

Чи всі блохи в пастці (тобто проблема справді полягає в квадратиках, на яких є більше однієї блохи), або це стосується блох по краях, які скачуть і зникають?
MissMonicaE

Відповіді:


10

Ти маєш рацію; Монте-Карло нездійсненно. (У наївному моделюванні - тобто такому, що точно відтворює проблемну ситуацію без будь-яких спрощень - кожна ітерація передбачала б 900 блохових рухів. Приблизна оцінка частки порожніх комірок дорівнює , маючи на увазі дисперсію Монте -Карло оцінка після N таких ітерацій становить приблизно 1 / N 1 / e ( 1 - 1 / e ) = 0,2325 ... / N1/eN1/N1/e(11/e)=0.2325/N. Щоб закріпити відповідь на шість знаків після коми, вам потрібно буде оцінити її в межах 5.E-7, і, щоб досягти впевненості в 95 +% (скажімо), вам доведеться приблизно вдвічі зменшити цю точність до 2,5E-7 . Розв’язування даєприблизноN>4E12, приблизно. Це було б близько 3.6E15 рухів блох, кожен з яких взяв кілька кліщів процесора. З одним сучасним доступним процесором вам знадобиться повний рік (високоефективних) обчислень. І я дещо невірно і надто оптимістично припустив, що відповідь дається як пропорція замість підрахунку: як підрахунок, знадобляться ще три значущі цифри, що спричиняють збільшення в обчисленнях на мільйон разів ... Можна довго чекати?)(0.2325/N)<2.5E7N>4E12

Що стосується аналітичного рішення, доступні деякі спрощення. (Вони також можуть бути використані для скорочення обчислень в Монте-Карло.) Очікувана кількість порожніх комірок - це сума ймовірностей порожнечі всіх клітин. Щоб знайти це, ви можете обчислити розподіл ймовірності чисельності зайнятості кожної комірки. Ці розподіли отримуються шляхом підсумовування (незалежного!) Внеску від кожної блохи. Це зменшує вашу проблему з пошуком кількості шляхів довжиною 50 вздовж сітки 30 на 30 між будь-якою парою комірок на цій сітці (одна - це походження блохи, а інша - клітина, для якої потрібно обчислити ймовірність заповнення блох).


2
Просто для розваги я зробив обчислення грубої сили в Mathematica. Його відповідь - відношення цілого числа 21 574 значень до цілого цілого числа 21 571; як десяткова, це зручно близько 900 / e, як очікувалося (але, оскільки нас просять не публікувати рішення, я більше не буду наводити деталі).
whuber

6

Не могли б ви пройти ітерацію через ймовірність окупації клітин для кожної блохи. Тобто, блоха k спочатку знаходиться в клітині (i (k), j (k)) з ймовірністю 1. Після 1 ітерації він має ймовірність 1/4 у кожній із 4 сусідніх комірок (якщо припустити, що він не знаходиться на межі чи в куточок). Потім наступна ітерація, кожна з цих чвертей, по черзі "розмазується". Після 50 ітерацій у вас є матриця ймовірностей зайнятості для блохи k. Повторіть всі 900 блох (якщо ви скористаєтеся симетрією, це зменшиться майже в 8 разів) та додайте ймовірності (не потрібно зберігати їх усі одразу, лише матриця поточної блохи (хм, якщо ви не є дуже розумно, можливо, вам потрібна додаткова робоча матриця) і поточна сума матриць). Мені здається, існує маса способів прискорити це тут і там.

Це не передбачає взагалі ніякого моделювання. Однак, це вимагає досить багато обчислень; не дуже важко опрацювати розмір моделювання, необхідний для того, щоб дати відповіді на дещо кращу точність, ніж 6 dp, з високою ймовірністю та з'ясувати, який підхід буде швидшим. Я думаю, що такий підхід би перемістив симуляцію з певним запасом.


2
Ви відповідаєте на дещо інше питання, ніж запитання. Питання задає очікувану кількість комірок, які будуть порожніми після 50 стрибків. Виправте мене, якщо я помиляюся, але я не бачу прямого шляху від ймовірності, що блоха опиниться на певному квадраті після 50 стрибків до відповіді, скільки комірок, як очікується, будуть порожніми.
Енді Ш

1
@Andy W - чудовий коментар; все ж Монте-Карло можна використовувати для цього останнього кроку ;-)

4
@Andy W: Насправді, важка частина отримала всі ці ймовірності. Замість того, щоб додавати їх у кожну клітинку, помножте їхні доповнення: така ймовірність, що комірка буде порожньою. Сума цих значень для всіх комірок дає відповідь. Підхід Glen_b б'є симуляцію на сім-вісім порядків ;-).
whuber

@whuber, дякую за пояснення. Дійсно, отримати ці ймовірності за менше хвилини було б складно. Це весела головоломка і дякує за ваш внесок.
Енді Ш

5

Хоча я не заперечую проти практичної неможливості (або непрактичності) вирішення цієї проблеми в Монте-Карло з точністю до 6 знаків після коми, що вказується шубером , я вважаю, що можна досягти вирішення з шестизначною точністю.

По-перше, після Glen_b частинки можуть бути змінені в стаціонарному режимі, отже, достатньо (як і в достатній мірі ) контролювати заповнення різних осередків, оскільки це також є процесом Маркова. Розподіл зайнятості на наступному етапі часу завершується визначається розміщенням в поточний час t . Написання перехідної матриці K , безумовно, недоцільно, але імітувати перехід просто.t+1tK

По-друге, як зазначає shabbychef , можна прослідкувати процес заповнення на 450 непарних (або парних) квадратах, які залишаються на непарних квадратах, якщо враховувати навіть парні часи, тобто квадратичну Маркову матрицю .K2

В- третіх, вихідна задача розглядає тільки частоту нульових , після 50 марковских переходів. Беручи під увагу , що початкова точка має дуже високе значення для стаціонарного розподілу ймовірностей ланцюга Маркова ( Х ( т ) ) , і за умови , що фокус на одному середньому по всім клітинам, р 0 = 1p^050(X(t))можна вважати, що реалізація ланцюга(X(t))у часіt=50є реалізацією від стаціонарного розподілу ймовірностей. Це призводить до значного зменшення обчислювальної вартості, оскільки ми можемо імітувати безпосередньо з цього стаціонарного розподілуπ, який є мультиноміальним розподілом з ймовірностями, пропорційними 2, 3 та 4 на рівний кут, інші комірки на краю та внутрішні комірки відповідно.

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

Як коментує Уаубер , оцінки потрібно помножити на 2, щоб правильно відповісти на питання, отже, остаточне значення 332,2137,


1
+1 Дуже проникливий. Я вважаю, що вам потрібно подвоїти свою остаточну відповідь, тому що питання задає всі 900 комірок.
whuber

1
Я вважаю, що ви можете починати далі від стаціонарного розподілу, ніж ви думаєте. Розрахунки грубої сили, які я спочатку робив, обчислювали 50-ту потужність перехідної матриці, використовуючи точну (раціональну) арифметику. З нього я отримав значення 330,4725035083710 .... Можливо, я допустив помилку ..... У мене виникла помилка, і тепер я отримую 330.7211540144080 .... Екстенсивна перевірка говорить про те, що матриця переходу правильна.
whuber

@whuber: Спасибі, це справді можливість. Я намагався знайти аргумент зв'язку, щоб визначити швидкість до стаціонарності, але не зміг. Моделювання в Монте-Карло з оригінальним процесом дало мені 333,96 за 10⁶ реплік і 57 годин обчислень. Без додаткових гарантій на точність.
Сіань

1
Ось мої міркування. Матриця переходу для 50 кроків - це 50-а потужність перехідної матриці, звідси її власними значеннями є 50-та сила власних значень. Лише власні вектори, відповідні значенням, 50-й потужність яких має будь-який помітний розмір, з'являться як компоненти в кінці ваших 50 кроків. Більше того, ці 50-ті держави інформують нас про відносну помилку, зроблену зупинкою на 50-му кроці, а не про те, щоб дійсно досягти сталого стану.
whuber

1
900×900

4

Аналітичний підхід може бути нудним, і я не продумав тонкощі, але ось такий підхід ви можете розглянути. Оскільки вас цікавить очікувана кількість осередків, які порожні після 50 кілець, вам потрібно визначити ланцюжок марків над "Ні блох у клітці", а не положення блохи (Див. Відповідь Glen_b, яка моделює положення блоха як ланцюг марків. Як вказував Енді в коментарях до цієї відповіді, такий підхід може не отримати того, що ви хочете.)

Зокрема, дозвольте:

nij(t)ij

Тоді ланцюг Маркова починається з наступного стану:

nij(0)=1ij

Оскільки бліхи переміщуються до однієї з чотирьох сусідніх клітин, стан клітини змінюється залежно від кількості бліх у клітині-мішені та скільки бліх у чотирьох сусідніх клітинах та ймовірності того, що вони перейдуть до цієї клітини. Використовуючи це спостереження, ви можете записати ймовірності переходу стану для кожної комірки як функцію стану цієї комірки та стану сусідніх комірок.

Якщо ви хочете, я можу розширити відповідь далі, але це разом з основним вступом до ланцюгів марків має розпочати вас.


1
nij

@whuber Ні, вам не потрібно підтримувати позицію блох як марківський ланцюг. Подумайте, що я пропоную, як випадкову прогулянку для клітини. Клітина спочатку знаходиться в положенні '1', звідки вона може перейти до 0, 1, 2, 3, 4 або 5. Імовірність переходу стану залежить від станів сусідніх комірок. Таким чином, запропонований ланцюг знаходиться на переосмисленому просторі стану (кількість клітинок для кожної комірки), а не на самому блоховому положенні. Чи має це сенс?

1
Це має сенс, але це здається кроком назад, адже чи не кількість штатів зараз значно більша? В одній моделі є 900 станів - положення однієї блохи - і не більше чотирьох переходів з кожного. Розрахунок потрібно робити лише для однієї блохи, оскільки всі вони рухаються незалежно. По-твоєму, здається, стан описується зайнятістю клітини разом із заповненням її до чотирьох сусідів. Це було б надзвичайно велика кількість держав, а також дуже велика кількість переходів між державами. Я, мабуть, нерозуміє, який у вас новий простір держави
whuber

{nij}

2

якщо ви збираєтеся пройти числовий шлях, просте спостереження: проблема, схоже, підлягає червоно-чорному паритету (блоха на червоному квадраті завжди рухається до чорного квадрата, і навпаки). Це може допомогти зменшити розмір вашої проблеми вдвічі (просто розгляньте два кроки за один раз, і придивіться, наприклад, лише до бліх на червоних квадратах)


1
Це приємне спостереження. Однак я вважаю, що це більше турбує, ніж варто це прямо використовувати. Більшість програмувань становить налаштування матриці переходу. Як тільки ви це зробите, просто намалюйте його і попрацюйте з цим. Використовуючи рідкісні матриці, видалення половини нулів все одно не економить.
whuber

@whuber: Я підозрюю, що суть цих проблем полягає в тому, щоб вивчити методи вирішення проблем, а не споживати багато обчислювальних циклів. Симетрія, паритет тощо - класичні прийоми з книги Ларсона щодо вирішення проблем.
shabbychef

1
Це хороший момент. Зрештою, потрібне певне судження. Проект Ейлер, як видається, наголошує на компромісах між математичним оглядом та ефективністю обчислень. Glen_b згадав про симетрії, які варто спочатку використати, оскільки від них є ще багато чого. Крім того, використовуючи розріджену арифметику матриці, ви досягнете двократного посилення автоматично (незалежно від того, знаєте ви про паритет чи ні!).
whuber

1

Я підозрюю, що деякі знання ланцюгів Маркова з дискретним часом можуть виявитися корисними.


3
Це повинен був бути коментарем, але я думаю, що ми можемо дідусь у цьому моменті.
gung - Відновіть Моніку

Це автоматично позначається як низька якість, ймовірно, тому, що воно таке коротке. Чи можете ви розширити його?
gung - Відновіть Моніку

Я не бачу чому: питання задає теми, які можуть бути корисними, і це тема, на мою думку, найбільш актуальна.
Саймон Бірн

1
Це було позначено як низька якість . Я проголосував, щоб це було нормально. Якщо ви подивитесь на інші відповіді на цю тему, то всі вони значно довші. Стандарти змінюються з часом, але сьогодні це вважатиметься коментарем, навіть якщо згадується "тема, яка може бути корисною". Як я вже говорив, я думав, що це може бути вічно, як є. Чи намагатиметесь ви розширити це, залежить від вас. Я просто давав вам знати.
gung - Відновіть Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.