Re: Kilpatehtävä 7

[vastaus aiempaan viestiin]

Kirjoittaja: Seppo Mustonen
Sähköposti:    -
Päiväys: 2.4.2008 14:06

Kuvatessani eilen (1.4.2008) tilastollisen tietojenkäsittelyn
seminaarissa tämän tehtävän ratkaisutapoja, huomasin, että tapauksessa
p=1/2 olin jäänyt puolitiehen tilanteissa, joissa arvotaan yksi
n vaihtoehdosta, kun n on pariton.

Tässä on parannettu kuvaus:

Olkoot vaihtoehdot V(1),V(2),...,V(n) ja tarvittavien heittojen
lukumäärän odotusarvo E(n).
Tällöin on E(2)=1 (koska valinta onnistuu aina yhdellä heitolla).
Kun n on parillinen, E(n)=1+E(n/2), koska vaihtoehdot voidaan
jakaa kahteen yhtäsuureen joukkoon ja yhdellä heitolla ratkaista,
kumpi osajoukko, suuruudeltaan n/2, pääsee jatkoon.
Kun n on pariton, on kaksi erilaista menettelyä, jotka kilpailevat
keskenään:
1) Lisätään vaihtoehtoihin yksi "kelvoton" vaihtoehto, jolloin
sen tullessa valituksi aloitetaan alusta. Kelvoton tulee valituksi
todennäköisyydellä r=1/(n+1) ja odotusarvo on tällöin
E1(n)=(1-r)*E(n+1)+r*(1-r)*2*E(n+1)+r^2*(1-r)*3*E(n+1)+...
     =(1-r)*E(n+1)*(1+2*r+3*r^2+4*r^3+...)
     =(1-r)*E(n+1)/(1-r)^2=E(n+1)/(1-r)=(n+1)/n*E(n+1)

Huomattakoon, että summan S=1+2*r+3*r^2+4*r^3+... arvo 1/(1-r)^2
(kun 0<=r<1) on helpoiten todettavissa näin:
S=1+2*r+3*r^2+4*r^3+...=(1+r+r^2+r^3+...) + r*(1+2*r+3*r^2+4*r^3+...)
                       =1/(1-r)+r*S
eli (1-r)*S=1/(1-r) eli s=1/(1-r)^2.

2) Ei aseteta vaihtoehtoja vastakkain pareittain, kuten aiemmassa
ratkaisussani tein, vaan valitaan ensimmäisellä heitolla puolet
vaihtoehdoista V_1,V_2,...,V_n-1 ja ratkaistaan toisella heitolla,
pääseekö viimeinen vaihtoehto V_n mukaan "toiselle kierrokselle".
Jatkoon pääsee siis joko (n-1)/2 tai (n-1)/2+1=(n+1)/2 vaihtoehtoa
samoin todennäköisyyksin ja näin tällä menettelyllä odotusarvoksi tulee
E2(n)=2+1/2*E((n-1)/2)+1/2*E((n+1)/2)
mikä on olennaisesti pienempi kuin aiemmassa ratkaisussa esitetty
E2(n)=(n+1)/2+1/2*E((n+1)/2)+1/2*E((n-1)/2).
.............
Survossa nämä odotusarvot saadaan kätevimmin seuraavalla
rekursiivisella laskentakaaviolla:

E(n):=if(n=1)then(0)else(Ep(n))
Ep(n):=if(n=2)then(1)else(E0(n))
E0(n):=if(n=2*int(n/2))then(1+E(n/2))else(min(E1(n),E2(n)))
E1(n):=(n+1)/n*(1+E((n+1)/2))
E2(n):=2+1/2*E((n-1)/2)+1/2*E((n+1)/2)

Yksittäiset arvot poimitaan aktivoimalla alla olevat:
E(2)=1
E(3)=2.5              E1(3)=2.6666666666667  E2(3)=2.5
E(4)=2
E(5)=3.75             E1(5)=4.2              E2(5)=3.75
E(6)=3.5
E(7)=3.4285714285714  E1(7)=3.4285714285714  E2(7)=4.25
E(8)=3
E(9)=4.875            E1(9)=5.2777777777778  E2(9)=4.875
E(10)=4.75
E(11)=4.9090909090909 E1(11)=4.9090909090909 E2(11)=5.625
E(12)=4.5
E(13)=4.7692307692308 E1(13)=4.7692307692308 E2(13)=5.4642857142857
E(14)=4.4285714285714
E(15)=4.2666666666667 E1(15)=4.2666666666667 E2(15)=5.2142857142857
E(16)=4
...

Erityisesti tapauksessa n=5
E1(5)=4.2
E2(5)=3.75
ja vastaavasti kun n=3,
E1(3)=2.6666666666667
E2(3)=2.5


Siis kun n=5, käytetään menettelyä 2) eli E(5)=2+1/2*E(2)+1/2*E(3)
eli E(5)=3.75, mikä on siis pienempi kuin aikaisemmin saamani 4.2.
Menettelyjen 1) ja 2) paremmuus vaihtelee. Esim. arvoilla n=7,11,13,15
1) on parempi ja arvoilla n=3,5,9 taas 2) johtaa pienempään
odotusarvoon.

Tarkennus:
==========
Menettelyjen 1) ja 2) kanssa kilpailee parittomilla n-arvoilla,
kun n ei ole alkuluku, seuraava:

Olkoon n=k*m, missä k on luvun n pienin tekijä > 1.
Tällöin jaetaan vaihtoehdot k osajoukkoon ja tehdään ensin valinta
"yksi k vaihtoehdosta", jolloin odotusarvoksi saadaan E(k)+E(m).
Tämä saattaa olla joskus pienempi kuin menettelyjen 1) ja 2) yhdistelmän
antama odotusarvo.

Ensimmäisenä tämä tapa puree arvolla n=21, koska 21=3*7 ja
E(3)+E(7)=5.9285714285714 on pienempi kuin E1(21)=6.1904761904762
ja E2(21)=6.8295454545455

Seuraava sukro laskee tällä tapaa parannetut odotusarvot:

*TUTSAVE P_PUOLI
/
/ def WN=W1 Wn=W2 WE1=W3 Wp=W4 WX=W5 Wk=W6 WE2=W7
/
*{R}
*ACCURACY=15 {R}
/
/ Odotusarvot talletetaan vektorina E, jonka aikaisempia
/ alkioita käytetään menettelyn 1) mukaisissa kaavoissa.
*MAT E=ZER({print WN},1) {act}{R}
*E(n):=if(n=2*int(n/2))then(1+MAT_E(n/2))else(min(E1(n),E2(n))) {R}
*E1(n):=(n+1)/n*(1+MAT_E((n+1)/2)) {R}
*E2(n):=2+1/2*MAT_E((n-1)/2)+1/2*MAT_E((n+1)/2) {R}
/
*{d}
*{ref}
*{d4}
*MAT E(1,1)=0{R}
*MAT E(2,1)=1{R}
*MAT E(3,1)=2.5{R}
*{u3}{pre}{act}
/ 3 ensimmäistä odotusarvoa annettu valmiina.
/ Wp=0, jos Wn=n on parillinen, muuten Wp=1.
*{Wn=3}{Wp=1}{R}
/
+ A: {ref}{erase}{Wn=Wn+1}{Wp=1-Wp}
/
/ Lasketaan arvoon WN asti, joka annetaan komennon parametrina.
- if Wn > WN then goto E
/
/ WE1 on menettelyn 1) mukainen odotusarvo.
*E({print Wn})={act}{l} {save word WE1}{R}
/ Jos n on parillinen, tarkennusta ei tarvita.
- if Wp = 0 then goto B
/ Pinimmän tekijän etsiminen parittomille n:
*{erase}{print Wn}(10:factors)={act}{l} {}
+ C: {r}{save char Wk}
/ Jos n aon alkuluku, ei voida tarkentaa:
- if Wk '=' {sp} then goto B
/ esim. 21(10:factors)=3*7
/       125(10:factors)=5^3
- if Wk '=' ^ then goto D
- if Wk '<>' * then goto C
/ Pienin tekijä on Wk:
+ D:  {l2}{save word Wk}{R}
/ Lasketaan  WE2=E(k)+E(m).
*MAT_E({print Wk})+MAT_E({Wk=Wn/Wk}{print Wk})={act}
*{l} {save word WE2}
/ Pienempi luvuista WE1 ja WE2 on E(n)
- if WE2 > WE1 then goto B
*{WE1=WE2}
/  Talletus matriisitiedostoon E.MAT
+ B: {line start}{erase}MAT E({print Wn},1)={print WE1}{act}
*{goto A}
+ E:
*{end}

Komennolla
/P_PUOLI 10000
olen laskenut odotuarvot, kun n=1,2,...,10000.

Odotusarvot, kun n=1,2,...,100:
  n E         n E         n E         n E         n E
  1 0.00000  21 5.92857  41 7.09756  61 6.26230  81 8.12963
  2 1.00000  22 5.90909  42 6.92857  62 6.16129  82 8.09756
  3 2.50000  23 5.73913  43 7.06977  63 6.09524  83 8.02410
  4 2.00000  24 5.50000  44 6.90909  64 6.00000  84 7.92857
  5 3.75000  25 6.00000  45 6.76667  65 7.98438  85 8.16471
  6 3.50000  26 5.76923  46 6.73913  66 7.96875  86 8.06977
  7 3.42857  27 5.62963  47 6.63830  67 8.05597  87 7.94828
  8 3.00000  28 5.42857  48 6.50000  68 7.93750  88 7.90909
  9 4.87500  29 5.44828  49 6.85714  69 8.18841  89 7.85393
 10 4.75000  30 5.26667  50 7.00000  70 8.07143  90 7.76667
 11 4.90909  31 5.16129  51 6.90196  71 7.98592  91 7.82418
 12 4.50000  32 5.00000  52 6.76923  72 7.87500  92 7.73913
 13 4.76923  33 6.96875  53 6.75472  73 8.35616  93 7.66129
 14 4.42857  34 6.93750  54 6.62963  74 8.24324  94 7.63830
 15 4.26667  35 7.07143  55 6.54545  75 8.16000  95 7.57895
 16 4.00000  36 6.87500  56 6.42857  76 8.05263  96 7.50000
 17 5.93750  37 7.24324  57 6.56140  77 8.02597  97 7.93814
 18 5.87500  38 7.05263  58 6.44828  78 7.92308  98 7.85714
 19 6.05263  39 6.92308  59 6.37288  79 7.84810  99 8.08081
 20 5.75000  40 6.75000  60 6.26667  80 7.75000 100 8.00000

Nämä tulokset eroavat aikaisemmista vain siten, että väleillä
(2^n+1,2^n+2^(n-2)), n=1,2,3,...  siis esim. (5,5), (9,10), (17,20),
(33,40), (65,80), ..., (2049,2560), ...  odotusarvot ovat pienemmät.

Seuraavat kaksi kuvaa havainnollistavat odotusarvon käyttäytymistä:
http://www.survo.fi/papers/p_puoli2.pdf 
Odotusarvo ei siis kasva tasaisesti ja on paikallisesti pienimmillään,
kun n on kakkosen potenssi tai jokin sellaisen kerrannainen.
Kasvu on likimain logaritmista.

En edelleenkään ole varma siitä, että nyt esitetty menettely johtaisi
kauttaaltaan pienimpiin odotusarvoihin. On siis mielenkiintoista nähdä,
löytyykö vielä parannettavaa.

Vastaukset:
[ei vastauksia]

Survo-keskustelupalstan (2001-2013) viestit arkistoitiin aika ajoin sukrolla, joka automaattisesti rakensi viesteistä (yli 1600 kpl) HTML-muotoisen sivukokonaisuuden. Vuoden 2013 alusta Survo-keskustelua on jatkettu entistäkin aktiivisemmin osoitteessa forum.survo.fi. Tervetuloa mukaan!

Etusivu  |  Keskustelu
Copyright © Survo Systems 2001-2013. All rights reserved.
Updated 2013-06-15.