Формула для скидання кісток (без грубої сили)


14

Перш за все я не впевнений, де це питання слід розміщувати. Я запитую, чи є проблема зі статистикою NP-Complete і чи не вирішувати її програмно. Я розміщую це тут, оскільки проблема зі статистикою є центральною точкою.

Я намагаюся знайти кращу формулу для вирішення проблеми. Проблема полягає в тому, що якщо у мене є 4d6 (4 звичайних 6-сторонніх кубиків) і закатати їх все одночасно, видалити штамп з найменшим числом (зване "скидання"), а потім підсумовуй решту 3, яка ймовірність кожного можливого результату ? Я знаю, що відповідь така:

Sum (Frequency): Probability
3   (1):         0.0007716049
4   (4):         0.0030864198
5   (10):        0.0077160494
6   (21):        0.0162037037
7   (38):        0.0293209877
8   (62):        0.0478395062
9   (91):        0.0702160494
10  (122):       0.0941358025
11  (148):       0.1141975309
12  (167):       0.1288580247
13  (172):       0.1327160494
14  (160):       0.1234567901
15  (131):       0.1010802469
16  (94):        0.0725308642
17  (54):        0.0416666667
18  (21):        0.0162037037

Середнє значення - 12,24, а середнє відхилення - 2,847.

Я знайшов вищезгадану відповідь грубою силою і не знаю, як чи є для цього формула. Я підозрюю, що ця проблема є NP-Complete, і тому її можна вирішити лише грубою силою. Можливо, вдасться отримати всі ймовірності 3d6 (3 звичайних 6-гранних кубика), а потім перекинути кожну з них вгору. Це було б швидше, ніж груба сила, тому що я маю швидку формулу, коли всі кістки зберігаються.

Я запрограмував формулу для збереження всіх кісток у коледжі. Я запитав свого професора статистики про це, і він знайшов цю сторінку , яку він мені потім пояснив. Існує велика різниця в продуктивності між цією формулою і грубою силою: 50d6 зайняло 20 секунд, але 8d6 краплі знизилися через 40 секунд (у хрому не вистачає пам'яті).

Чи ця проблема NP-завершена? Якщо так, будь ласка, надайте доказ, якщо ні, будь-ласка, вкажіть формулу, яка не є грубою, щоб вирішити це.

Зауважте, що я мало знаю про NP-Complete, тому я можу думати про NP, NP-Hard або щось інше. Доказ NP-повноти для мене марний. Єдина причина, чому я прошу, - це не дозволяти людям здогадуватися. І, будь ласка, розмовляйте зі мною, оскільки минуло багато часу, коли я працював над цим: я не пам’ятаю статистику так добре, як мені може знадобитися це вирішити.

В ідеалі я шукаю більш загальну формулу для кількості X кісток з Y сторонами, коли N з них скинуто, але я починаю з чогось набагато простішого.

Редагувати:

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

Для тих, хто цікавиться, я запрограмував відповідь whuber в JavaScript на моєму GitHub (в цьому виконуються лише тести, які фактично використовують визначені функції).


1
Це цікаве питання. Я думаю, що це повинно бути теми. Спасибі за вашу увагу.
gung - Відновіть Моніку

1
Хоча налаштування цікаве, ви ще не задали відповідального питання: ідея повноти NP залежить від наявності класу проблем, тоді як ви описали лише одну. Як саме ви хочете узагальнити це? Хоча ви натякаєте, що кількість кісток може змінюватись, можливі різні додаткові варіанти, і вони можуть дати різні відповіді: ви можете змінити кількість облич, значення на обличчях, числа кісток і числа викинутих кісток, і все. по-різному з різними стосунками між ними.
whuber

1
@whuber Вона не знає жодної теорії складності, але я думаю, що зрозуміло, що вона задає проблемі, пов'язані зі зміною кількості кісток. Я також думаю, що у мене є ефективний алгоритм для цього.
Енді Джонс

2
@Andy Я бачу наприкінці, вона просить "більш загальної формули для X числа кісток з Y сторонами, коли N з них скинуто".
whuber

@whuber Га! Мабуть, не так зрозуміло, як я тоді думав. Вибач, моя погана.
Енді Джонс

Відповіді:


5

Рішення

Нехай буде кубика, кожен з яких дає однакові шанси на результати 1 , 2 , , d = 6 . Нехай K - мінімум значень, коли всі n кістки незалежно кинуті.n=41,2,,d=6Kn

Розглянемо розподіл суми всіх значень умовних на K . Нехай X - це сума. Функція генерації для кількості способів формування будь-якого заданого значення X , враховуючи, що мінімум становить принаймні k , єnKXXk

(1)f(n,d,k)(x)=xk+xk+1++xd=xk1xdk+11x.

Оскільки кістки незалежні, функція генерування для кількості способів формування значень де всі n кісток показують значення k або більшеXnk

(2)f(n,d,k)(x)n=xkn(1xdk+11x)n.

Ця функція генерування включає умови для подій, де перевищує k , тому нам потрібно відняти їх. Тому функція генерування для кількості способів формування значень X , заданих K = k , єKkXK=k

(3)f(n,d,k)(x)nf(n,d,k+1)(x)n.

Відзначаючи , що сума максимальних значень є сумою всіх значень мінус наімалейшіх, рівне X - K . Тому функцію, що генерує, потрібно розділити на k . Це стає функцією, що формує ймовірність, при множенні на загальний шанс будь-якої комбінації кісток, ( 1 / д ) n :n1XKk(1/d)n

(4)dnk=1dxk(f(n,d,k)(x)nf(n,d,k+1)(x)n).

Оскільки всі поліномічні добутки та потужності можна обчислити в операціях (вони є згортками і тому можуть бути здійснені за допомогою дискретного швидкого перетворення Фур'є), загальне обчислювальне зусилля становить O ( kO(nlogn) . Зокрема,це поліноміальний алгоритм часу.O(knlogn)


Приклад

Давайте попрацюємо на прикладі у запитанні з та d = 6 .n=4d=6

Формула для PGF X умовна для K k дає(1)XKk

f(4,6,1)(x)=x+x2+x3+x4+x5+x6f(4,6,2)(x)=x2+x3+x4+x5+x6f(4,6,5)(x)=x5+x6f(4,6,6)(x)=x6f(4,6,7)(x)=0.

Підвищення їх до потужності , як у формулі ( 2 ) виробляєn=4(2)

f(4,6,1)(x)4=x4+4x5+10x6++4x23+x24f(4,6,2)(x)4=x8+4x9+10x10++4x23+x24f(4,6,5)(x)4=x20+4x21+6x22+4x23+x24f(4,6,6)(x)4=x24f(4,6,7)(x)4=0

Їх послідовні відмінності у формулі є(3)

f(4,6,1)(x)4f(4,6,2)(x)4=x4+4x5+10x6++12x18+4x19f(4,6,2)(x)4f(4,6,3)(x)4=x8+4x9+10x10++4x20f(4,6,5)(x)4f(4,6,6)(x)4=x20+4x21+6x22+4x23f(4,6,6)(x)4f(4,6,7)(x)4=x24.

Отримана сума у ​​формулі дорівнює(4)

64(x3+4x4+10x5+21x6+38x7+62x8+91x9+122x10+148x11+167x12+172x13+160x14+131x15+94x16+54x17+21x18).

Наприклад, ймовірність того, що три верхні кубики дорівнюють - це коефіцієнт x 14 , дорівнює14x14

64×160=10/81=0.123456790123456.

Це повністю узгоджується з ймовірністю, наведеною у питанні.

До речі, середня (як обчислюється з цього результату) є і стандартне відхилення 15869/129612.244598765.13612487/16796162.8468444

Аналогічний (неоптимізований) розрахунок для кубиків замість n = 4 зайняв менше півтори секунди, підтверджуючи твердження, що це не обчислювально складний алгоритм. Ось сюжет основної частини розповсюдження:n=400n=4

Малюнок

Так як мінімальна досить імовірно , рівним 1 , а сума Х буде надзвичайно близькі до того , нормальне ( 400 × 7 / 2 , 400 × 35 / 12 ) розподілу (чиє середнє значення +1400 і стандартне відхилення становить приблизно 34,1565 ), то середнє значення повинно бути надзвичайно близьким до 1400 - 1 = 1399, а середнє відхилення - надзвичайно близьким до 34,16 . Це чудово описує сюжет, вказуючи, що це, ймовірно, правильно. Насправді точний розрахунок дає середнє значення приблизноK1X(400×7/2,400×35/12)140034.156514001=139934.16 більше 1399 і стандартне відхилення приблизно на 1,24 × 10 - 31 менше2.13×103213991.24×1031 .400×35/12


1
Ваша відповідь швидка і правильна, тому я позначив її як відповідь. Також в редакції я сказав, що також було б добре мати частоту, якщо це можливо. Для цього вам не потрібно редагувати свою відповідь, оскільки я можу бачити, що 6^-4множник використовується для перетворення частоти на ймовірність.
SkySpiral7

6

Редагувати: У @SkySpiral виникли проблеми з формулюванням наведеної нижче формули. Наразі я не встигаю розібратися, у чому проблема, тому якщо ви читаєте це, краще продовжувати припускати, що це неправильно.


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

XnnYnn

p(Yn=a)=kp(Yn1=ak)p(Xn=k)

Znn

p(Zn=a)=p(nth die is the smallest)p(Yn1=a)+p(nth die is not the smallest)kp(Zn1=ak)p(Xn=k)

Mnn

p(Zn=a)=p(XnMn1)p(Yn1=a|XnMn1)+p(Xn>Mn1)kp(Zn1=ak)p(Xn=k|Xn>Mn1)

Mn

p(Mn=a)=p(XnMn1)p(Xn=a|XnMn1)+p(Xn>Mn1)p(Mn1=a|Xn>Mn1)

Yn,ZnMnn

p(XnMn1)Xn,Mn1

p(XnMn1)=a,bp(Xn=a,Mn1=b,ab)

p(Xn=k|Xn>Mn1)Xn,Mn1


1
+1 Це виглядає правильно, і ви сказали, що це квадратично. Але пройшло кілька років, як я взяв статистику (я в першу чергу програміст). Тому я хотів би повністю зрозуміти це, перш ніж позначити це як відповідь. Також я бачу, що у вас є p (n-й - найменший штамп), це включає, якщо n-я пов'язана з найменшою? Наприклад, прокатка всіх 3-х.
SkySpiral7

nYn1(<)()

Дякую. Якщо я правильно це розумію, я думаю, що ваші формули - це відповідь. Однак я не знаю, як обчислити p (X (n)> M (n-1)) (або заперечення цього) або p (X (n) = k | X (n)> M (n-1 )) тому я ще не можу використовувати цю відповідь. Я відзначу це як відповідь, але мені хотілося б більше інформації. Чи можете ви відредагувати свою відповідь, щоб пояснити це, або я повинен розмістити це як інше запитання?
SkySpiral7

Відредагував мою відповідь.
Енді Джонс

1
Вибачте, я знаю, що минуло півтора року, але я нарешті взявся до впровадження цієї формули в код. Однак формула p (Z (n) = a) видається неправильною. Припустимо, 2 кубики з двох сторін (крапля найнижча), які шанси на результат буде 1? Шанс X (n) бути найменшим або прив'язаним дорівнює 3/4, а p (Y (n-1) = 1) 1/2, так що Z (n) повертається принаймні 3/8, хоча правильна відповідь 1/4. Формула Z виглядає правильно для мене, і я не знаю, як це виправити. Тож якщо не надто багато запитати: як ви думаєте?
SkySpiral7

1

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

XNdYXY1YN43d63,4,51,3,4,5на чотирьох кубиках. (Зауважте, що я називаю це "послідовністю", але порядок тут не важливий, тим більше, що все, що нас цікавить, врешті-решт - це сума послідовності.)

P(XNdY=S)P(43d6=S)

Sks0,s1,...,sksi>si+1siciS=3,4,4,5(s0,c0)=(5,1)(s1,c1)=(4,2)(s2,c2)=(3,1)

P(XNdY=S)

P(XNdY=S)=(i=0k1(Xh=0i1chci))(j=0XN(ck+XNck+XNj)(sk1)j)YX

Це досить безладно, я знаю.

i=0k1Ss0(Xci)s1c0s0sih=0i1ch

j=0XNsksk

P[43d6=(5,4,4)]

(s1,c1)=(5,1)
(s2,c2)=(4,2)

Отже, використовуючи формулу вище:

P[43d6=(5,4,4)]=(41)((33)30+(32)31)64=5162=0.0308641975¯

sk=1j=0001sk=1

XNdYSS

XNdY


Як програмісту, мені може бути простіше зрозуміти ваш код Python (хоча я ніколи не використовував Python, щоб це було те саме). Розміщення коду тут поза темою, але ви можете опублікувати посилання на github тощо
SkySpiral7

1
Ваша відповідь може бути правильною і, здається, зменшує складність з O(Y^X)до, O((Y+X-1)!/(X!*(Y-1)!))але вона все ще не настільки ефективна, як відповідь Ваубера O(c*X*log(X)). Дякуємо за вашу відповідь, хоча +1.
SkySpiral7
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.