Formuła do rzucania kostkami (siła nie brutalna)


14

Przede wszystkim nie jestem pewien, gdzie należy zadać to pytanie. Pytam, czy problem statystyczny jest NP-Complete i czy nie mam go rozwiązać programowo. Zamieszczam go tutaj, ponieważ problem statystyczny jest punktem centralnym.

Próbuję znaleźć lepszą formułę rozwiązania problemu. Problem polega na tym: jeśli mam 4k6 (4 zwykłe 6-stronne kości) i rzucam je wszystkie naraz, usuń kość o najniższej liczbie (zwanej „upuszczeniem”), a następnie zsumuj pozostałe 3, jakie jest prawdopodobieństwo każdego możliwego wyniku ? Wiem, że odpowiedź brzmi:

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

Średnia wynosi 12,24, a odchylenie standardowe wynosi 2,847.

Znalazłem powyższą odpowiedź brutalną siłą i nie wiem, jak i czy istnieje na to formuła. Podejrzewam, że ten problem jest NP-Complete i dlatego można go rozwiązać jedynie brutalną siłą. Możliwe jest uzyskanie wszystkich prawdopodobieństw 3d6 (3 normalne 6-stronne kości), a następnie przekrzywienie każdego z nich w górę. Byłoby to szybsze niż brutalna siła, ponieważ mam szybką formułę, gdy wszystkie kości są trzymane.

Zaprogramowałem formułę przechowywania wszystkich kości na studiach. Zapytałem o to mojego profesora statystyki, a on znalazł tę stronę , którą mi następnie wyjaśnił. Istnieje duża różnica w wydajności między tą formułą a brutalną siłą: 50d6 zajęło 20 sekund, ale 8d6 upuściło najniższe awarie po 40 sekundach (chrome zabrakło pamięci).

Czy to jest problem NP-Complete? Jeśli tak, proszę przedstawić dowód, a jeśli nie, proszę podać formułę bez użycia siły, aby go rozwiązać.

Zauważ, że niewiele wiem o NP-Complete, więc mogę myśleć o NP, NP-Hard lub o czymś innym. Dowód kompletności NP jest dla mnie bezużyteczny, jedynym powodem, dla którego o to proszę, jest zapobieganie zgadywaniu. I proszę, obnażcie się ze mną, bo od dawna nad tym pracuję: nie pamiętam statystyk tak dobrze, jak być może będę musiał to rozwiązać.

Idealnie szukam bardziej ogólnej formuły dla liczby X kości ze stronami Y, gdy N zostanie upuszczonych, ale zaczynam od czegoś znacznie prostszego.

Edytować:

Wolałbym również ten wzór od częstotliwości wyjściowych, ale dopuszczalne są tylko prawdopodobieństwa wyjściowe.

Dla zainteresowanych zaprogramowałem odpowiedź Whubera w JavaScript na moim GitHub (w tym zatwierdzeniu tylko testy faktycznie używają zdefiniowanych funkcji).


1
To interesujące pytanie. Myślę, że tutaj powinno być na temat. Dziękuję za uwagę.
gung - Przywróć Monikę

1
Chociaż ustawienie jest interesujące, nie zadałeś jeszcze pytania, na które można odpowiedzieć: idea kompletności NP zależy od posiadania klasy problemów, podczas gdy opisałeś tylko jeden. Dokładnie jak chcesz to uogólnić? Chociaż sugerujesz, że liczba kości może się różnić, możliwe są różne dodatkowe opcje i mogą one dać różne odpowiedzi: możesz zmienić liczbę twarzy, wartości na twarzach, liczbę kości i liczbę upuszczonych kości, wszystko na różne sposoby, z różnymi relacjami między nimi.
whuber

1
@whuber Nie zna żadnej teorii złożoności, ale myślę, że jasne jest, że pyta o rodzinę problemów generowanych przez zmianę liczby kości. Myślę też, że mam do tego wydajny algorytm.
Andy Jones,

2
@Andy, widzę na końcu, że prosi o „bardziej ogólną formułę dla liczby X kości z bokami Y, gdy N zostanie upuszczonych”.
whuber

@whuber Hah! Najwyraźniej nie tak jasne, jak myślałem wtedy. Przepraszam moja wina.
Andy Jones,

Odpowiedzi:


5

Rozwiązanie

Niech będzie kości, z których każda daje równe szanse na wyniki 1 , 2 , , d = 6 . Niech K będzie minimalną wartością, gdy wszystkie n kości są rzucane niezależnie.n=41,2,,d=6Kn

Rozważmy rozkład sumy wszystkich wartości warunkowych na K . Niech X będzie tą sumą. Funkcja generująca liczbę sposobów formowania dowolnej wartości X , biorąc pod uwagę, że minimum wynosi co najmniej k , wynosinKXXk

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

Ponieważ kości są niezależne, funkcja generująca liczbę sposobów formowania wartości gdzie wszystkie n kości wykazują wartości k lub większe, wynosiXnk

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

Ta funkcja generująca obejmuje terminy dla zdarzeń, w których przekracza k , więc musimy je odjąć. Dlatego funkcja generująca liczbę sposobów tworzenia wartości X , przy danym K = k , wynosiKkXK=k

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

Zauważyć, że suma najwyższych wartości jest sumą wszystkich wartości ujemnych najmniejsza, równa X - K . Funkcję generującą należy zatem podzielić przez k . Staje się funkcją generującą prawdopodobieństwo po pomnożeniu przez wspólną szansę dowolnej kombinacji kości, ( 1 / d ) n :n1XKk(1/d)n

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

Ponieważ wszystkie produkty i moce wielomianowe można obliczyć w operacjach (są one zwojami, a zatem można je przeprowadzić za pomocą dyskretnej szybkiej transformaty Fouriera), całkowity wysiłek obliczeniowy wynosi O ( kO(nlogn) . W szczególnościjest to algorytm wielomianowy.O(knlogn)


Przykład

Praca Załóżmy, poprzez przykład, w kwestii z , a d = 6 .n=4d=6

Wzór dla PGF X zależnego od K k daje(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.

Zwiększenie ich do mocy jak we wzorze ( 2 ), dajen=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

Ich kolejne różnice we wzorze (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.

Wynikowa suma we wzorze wynosi(4)

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

Na przykład szansa, że ​​pierwsze trzy kości sumują się do to współczynnik x 14 równy14x14

64×160=10/81=0.123456790123456.

Jest to całkowicie zgodne z prawdopodobieństwami przytoczonymi w pytaniu.

Nawiasem mówiąc, średnia (obliczony na podstawie tego wyniku) wynosi i odchylenie standardowe jest 15869/129612.244598765.13612487/16796162.8468444

Podobne (niezoptymalizowane) obliczenie dla kości zamiast n = 4 zajęło mniej niż pół sekundy, potwierdzając twierdzenie, że nie jest to algorytm wymagający obliczeń. Oto wykres głównej części dystrybucji:n=400n=4

Postać

Ponieważ minimalne jest bardzo prawdopodobnie równy 1 , a suma x będzie bardzo blisko mający normalną ( 400 x 7 / 2 , 400 x 35 / 12 ) dystrybucji (którego średnia wynosi 1400 i odchylenie standardowe wynosi około 34,1565 ), przy czym średnia musi być bardzo bliska 1400 - 1 = 1399, a odchylenie standardowe bardzo blisko 34,16 . To ładnie opisuje fabułę, wskazując, że prawdopodobnie jest poprawna. W rzeczywistości dokładne obliczenia dają średnią okołoK1X(400×7/2,400×35/12)140034.156514001=139934.16 większa niż 1399 , a odchylenie standardowe około 1,24 x 10 - 31 mniej niż2.13×103213991.24×1031 .400×35/12


1
Twoja odpowiedź jest szybka i poprawna, dlatego oznaczyłem ją jako odpowiedź. Również w edycji powiedziałem, że byłoby miło mieć częstotliwości, jeśli to możliwe. W tym celu nie musisz edytować swojej odpowiedzi, ponieważ widzę, że 6^-4mnożnik służy do konwersji częstotliwości na prawdopodobieństwo.
SkySpiral7,

6

Edycja: @SkySpiral miał problem z uruchomieniem poniższej formuły. Obecnie nie mam czasu, aby dowiedzieć się, na czym polega problem, więc jeśli czytasz to, najlepiej postępować przy założeniu, że jest to nieprawidłowe.


Nie jestem pewien ogólnego problemu z różną liczbą kości, boków i upuszczeń, ale myślę, że widzę wydajny algorytm dla przypadku drop-1. Kwalifikator polega na tym, że nie jestem całkowicie pewien, czy jest poprawny, ale w tej chwili nie widzę żadnych wad.

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 To wygląda poprawnie i powiedziałeś, że to kwadrat. Ale minęło kilka lat, odkąd wziąłem statystyki (jestem przede wszystkim programistą). Chciałbym więc to w pełni zrozumieć, zanim oznaczysz to jako odpowiedź. Widzę też, że masz p (n-ta jest najmniejszą kością). Czy to obejmuje, jeśli n-ta jest powiązana z najmniejszą? Takich jak rzut wszystkie 3.
SkySpiral7,

nYn1(<)()

Dziękuję Ci. Jeśli dobrze to rozumiem, myślę, że twoje formuły są odpowiedzią. Nie wiem jednak, jak obliczyć p (X (n)> M (n-1)) (lub jego negacja) lub p (X (n) = k | X (n)> M (n-1) )), więc nie mogę jeszcze użyć tej odpowiedzi. Oznaczę to jako odpowiedź, ale chciałbym uzyskać więcej informacji. Czy możesz edytować swoją odpowiedź, aby je wyjaśnić, czy powinienem opublikować ją jako kolejne pytanie?
SkySpiral7

Edytowałem moją odpowiedź.
Andy Jones,

1
Przepraszam, wiem, że minęło półtora roku, ale w końcu udało mi się wdrożyć tę formułę do kodu. Jednak formuła p (Z (n) = a) wydaje się niepoprawna. Załóżmy, że 2 kości z 2 stronami (najniższy spadek), jakie są szanse na wynik 1? Szansa, że ​​X (n) będzie najmniejsza lub powiązana, wynosi 3/4, a p (Y (n-1) = 1) wynosi 1/2, więc Z (n) zwraca co najmniej 3/8, mimo że poprawna odpowiedź to 1/4 Formuła Z wygląda dla mnie poprawnie i nie wiem, jak to naprawić. Więc jeśli nie jest zbyt wiele, aby zapytać: co myślisz?
SkySpiral7

1

Mam do tego dość wydajny algorytm, który podczas testowania wydaje się odpowiadać wynikom czystej brutalnej siły, a mniej polegać na wyliczaniu wszystkich możliwości. Jest właściwie bardziej uogólniony niż powyższy problem 4d6, upuść 1.

XNdYXY1YN43d63,4,51,3,4,5na czterech kostkach. (Zauważ, że nazywam to „sekwencją”, ale kolejność nie jest tutaj ważna, szczególnie, że na końcu zależy nam na sumie).

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

To dość niechlujne, wiem.

i=0k1Ss0(Xci)s1c0s0sih=0i1ch

j=0XNsksk

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

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

Korzystając z powyższego wzoru:

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

sk=1j=0001sk=1

XNdYSS

XNdY


Jako programista może mi łatwiej zrozumieć Twój kod Pythona (chociaż nigdy nie korzystałem z Pythona, więc może być taki sam). Zamieszczanie kodu tutaj jest nie na temat, ale możesz opublikować link do github itp.
SkySpiral7 31.10.16

1
Twoja odpowiedź może być poprawna i wydaje się zmniejszać złożoność z O(Y^X)do, O((Y+X-1)!/(X!*(Y-1)!))ale nadal nie jest tak skuteczna jak odpowiedź Whubera O(c*X*log(X)). Dziękuję za odpowiedź przez +1.
SkySpiral7,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.