Survo-ristikoiden ratkaiseminen reunasummien tulojen avulla
Tähänastiset kokemukset osoittavat, että Survo-ristikoiden
ratkaisemisessa ilman varsinaista ratkaisuohjelmaa
saatetaan käyttää hyvinkin erilaisia keinoja.
Useimmin toimitaan puhtaasti loogisten päätelmien avulla, mutta joskus
myös esim. Survon antama laskennallinen tuki on hyödyksi.
Normaalissa manuaalisessa ratkaisutavassa ristikkoa pyritään täyttämään
avointen ruutujen osalta vaihe vaiheelta parhaimmillaan
tiukan päättelyketjun avulla siten, että joka tilanteessa tehty
valinta on ainoa mahdollinen. Varsinkin helppoja ristikkoja
monet kuitenkin ratkovat myös osittain arvaamalla.
Esitän tässä erilaisen menettelyn, joka perustuu muutaman jo aikaisemmin
käytetyn keinon yhdistelemiseen ja muuntaa tehtävän hieman
shakkitehtävän tapaiseksi.
Tällä menetelmällä useat vaikeiksi koetut tehtävät saattavat ratketa
yllättävän helposti. Se ei kuitenkaan anna kätevää ratkaisua kaikille
Survo-ristikoille eikä sen avulla voi ainakaan toistaiseksi todeta
ratkaisun yksikäsitteisyyttä.
Tämä ratkaisutapa on toisaalta sukua alkuperäisen ratkaisuohjelmani
pääidealle, jossa
(satunnaisesti täytettyä) taulukkoa parannellaan vaihtamalla
lukujen paikkoja niin, että saadaan lopulta annetut ja
lasketut summat täsmäämään
ja toisaalta sille ilmeiselle piirteelle, että
pienet luvut sijoittuvat pienten summien risteyksiin ja
suuret suurten risteyksiin
sekä täsmällisemmin mm. Joonas Kauppisen ja Markku Verkasalon
esittämiin näkemyksiin siitä, että
reunasummien tulot osoittavat karkeasti lukujen oikean järjestyksen.
Reunasummien tulojen käytölle löytyy tilastollinen perustelu.
Jos tulkitaan Survo-ristikko kahden muuttujan otoksesta lasketuksi
frekvenssitaulukoksi ja muuttujat oletetaan toisistaan riippumattomiksi,
taulukon kussakin ruudussa odotettu frekvenssi on vastaavien reuna-
summien tulo jaettuna otoskoolla. Siis nuo tulot sellaisinaan ovat
verrannollisia odotettuhin frekvensseihin.
Kun nämä periaatteet yhdistetään (ja mietitään hieman lisää), ainakin
avoimet Survo-ristikot (olen ehtinyt vasta tarkastella lähemmin
4x4-tapausta) saa ratkaistuksi useimmiten yllättävän helposti hiukan
shakkitehtävien tyyliin esim. "matti kahdella siirrolla".
Näytän, miten se tapahtuu viime vuoden kesäkuun ensimmäisessä
kirjoituksessani (sivuilla 17-21) esitetyssä ja ratkaistussa tehtävässä
* * * * 14
* * * * 28
* * * * 44
* * * * 50
16 33 40 47
Reunasummien tulojen taulukko on silloin
224 462 560 658 14
448 924 1120 1316 28
704 1452 1760 2068 44
800 1650 2000 2350 50
16 33 40 47
ja kun luvut 1-16 pannaan taulukkoon näiden tulojen
suuruusjärjestyksessä, saadaan taulukko
1 3 4 5 14
2 8 9 10 28
6 11 13 15 44
7 12 14 16 50
16 33 40 47
joka ei sellaisenaan kelpaa, koska esim. ensimmäinen
rivisumma on 1+3+4+5=13 eikä 14, mutta summat ovat
silti lähellä oikeita seuraavasti:
Sum OK D
1 3 4 5 13 14 -1
2 8 9 10 29 28 1
6 11 13 15 45 44 1
7 12 14 16 49 50 -1
Sum 16 34 40 46
OK 16 33 40 47
D 0 1 0 -1 W=6
Tässä Sum vastaa laskettua summaa, OK oikeaa summaa ja D niiden erotusta
(virhettä) D=Sum-OK. Virheiden itseisarvojen summa on W=6.
Tavoitteena on nyt pienentää virhettä vaihtamalla sopivasti kahden luvun
paikkoja. Hyvältä näyttää tällöin vaihto (5,6), mikä johtaa tilanteeseen
Sum OK D
1 3 4 6 14 14 0
2 8 9 10 29 28 1
5 11 13 15 44 44 0
7 12 14 16 49 50 -1
Sum 15 34 40 47
OK 16 33 40 47
D -1 1 0 0 W=4
eli virhe on pudonnut arvoon W=4.
Tästä päästäänkin perille heti toisella siirrolla (7,8)
Sum OK D
1 3 4 6 14 14 0
2 7 9 10 28 28 0
5 11 13 15 44 44 0
8 12 14 16 50 50 0
Sum 16 33 40 47
OK 16 33 40 47
D 0 0 0 0 W=0
eli tehtävä ratkeaa todella helposti verrattuna vaikka alkuperäiseen
ratkaisuuni, jossa tosin pääteltiin samalla tuloksen yksikäsitteisyys.
Äskeisessä tehtävässä tarvittiin siis vain kaksi siirtoa.
Näin vähällä ei yleensä selvitä, mutta em. kirjoituksessani sivulla 24
esitetty ristikko, jolle nyt etsittiin mahdollisimman yksinkertaista
ratkaisua tehtävänä 65/2007
A B C D
1 * * * * 51
2 * * * * 36
3 * * * * 32
4 * * * * 17
51 42 26 17
ratkeaa sekin tällä "vaihtomenetelmällä" yllättävän sukkelasti eli
viidellä siirrolla. Ratkaisun olen saattanut Flash-demon muotoon.
Selvittääkseni, miten tämä menettely toimii yleisesti avoimilla,
yksikäsitteisesti ratkeavilla 4x4-ristikoilla, joita on 5327,
olen etsinyt niistä jokaiselle lyhimmän ratkaisun.
Siirtoja tarvitaan seuraavan taulukon mukaisesti
Siirtoja 0 1 2 3 4 5 6 7 8 9
frekvenssi 85 262 522 977 1271 1222 696 255 36 1
kumul. 85 347 869 1846 3117 4339 5035 5290 5326 5327
% 1.6 6.5 16.3 34.7 58.5 81.5 94.5 99.3 100.0
Summien tulot antavat siis suoraan ratkaisun 85 tapauksessa 5327:stä
ja 81.5 % näistä ristikoista ratkeaa alle 6 siirrolla.
Olen pyrkinyt ratkaisemaan (menettelyn alkuasetelmasta ja siirtojen
kirjanpidosta huolehtivan) sukron /SP_SWAP tuella useita näistä
tehtävistä ja kokemukseni viittaavat siihen, että jos siirtojen määrä
on korkeintaan 5, tehtävän saa selvitettyä suhteellisen helposti.
Ryhtyessään ratkomaan tehtävää ei kuitenkaan voi tietää etukäteen
tarvittavien siirtojen määrää. Jonkinlaisen ennusteen saa tehtävän
summien tulojen avulla muodostetun alkuasetelman virhesumman W avulla.
W vaihtelee nollasta arvoon 22 ja se kertoo tarvittavien siirtojen
määrästä mm. seuraavaa:
W siirtoja<6 W-arvojen frekvenssit
0-4 100.0 % 467
6 99.5 % 417
8 99.0 % 609
10 93.6 % 879
12 85.8 % 896
14 70.6 % 929
16 56.6 % 681
18 49.6 % 312
20 46.8 % 126
22 54.5 % 11
kaikki 81.5 % 5327
Jos siis virheiden lähtösumma on 10 tai pienempi, 4x4-ristikko ratkeaa
alle 6 siirrolla "93.6-prosenttisesti".
Siirtojen määrän keskiarvo on noin 4 (ja hajonta 1.6). Jos
aloitettaisiin aivan umpimähkään täytetystä ristikosta, keskiarvo
olisi olennaisesti suurempi eli noin 12.6 (ja hajonta 1.3),
mikä näytetään seuraavasti.
Menetelmän toimivuus (ainakin tässä 4x4-tilanteessa) perustuu paljolti
myös siihen, että jos lasketaan kaikista 5327 ristikosta (kuvitellen
ne frekvenssitaulukoiksi) khi^2-arvot, ne sijoittuvat välille
(0.25,8.25) eli suurinkin niistä on alle vapauasteiden 9 lukumäärän,
joka on riippumattomilla muuttujilla odotusarvo. Keskiarvo on nyt 3.95
ja keskihajonta 1.76. Niinpä näissä taulukoissa tuo "muuttujien
riippumattomuus" on siis jopa ylikorostunutta ja siksi summien tulot
ennustavat hyvin oikeaa ratkaisua.
Useimmiten ratkaisun pääjuonena on tehdä vaihdot niin, että virhesumma W
alenee jokaisessa siirrossa, koska tällöin "hyvän pelisilmän omaava"
näkee kussakin tilanteessa, mitkä vaikuttavat järkeviltä valinnoilta.
Toisinaan tilanne on hankalampi mm. siten, että W on heti alkuun niin
alhainen, ettei edellinen strategia pure, vaan on tehtävä "uhrauksia"
(hiukan shakkiongelmien tyyliin) eli valittava siirtoja, joissa W
väliaikaisesti kasvaa. Tällöin joutuu käyttämään myös muunlaisia
päättelyjä seuraavan esimerkin tapaan.
* * *
Jotta tässä kuvattua tekniikkaa olisi käytännössä mahdollisimman helppo
soveltaa, olen siis laatinut sukron /SP_SWAP, joka "esitäyttää" ristikon
summien tulojen mukaisesti ja antaa sitten käyttäjälle tilaisuuden tehdä
peräkkäin hiiren ja X-, Y-nappien avulla haluamiaan vaihtoja (swap).
Sukro päivittää jokaisen vaihdon jälkeen pelipöytäkirjan ja näyttää
siirtohistorian. Sukrolla on mahdollista käsitellä myös ei-avoimia
ristikoita, sillä esitäyttöohjelma (uusi pieni Survo-moduli SPGUESS)
käyttää silloin hieman yleistettyä summientulo-tekniikkaa. Näissä
tapauksissa valmiiksi annetut luvut näytetään sinisellä taustalla, jotta
pelaaja tietää varoa siirtelemästä noita "kiintopisteitä".
Sukron /SP_SWAP käyttö edellyttää täyttä SURVO MM -versiota.
Erikseen olen myöhemmin (vuoden 2008 alussa) tehnyt verkossa toimivan
Java-sovelman,
joka luo arpoen lukuisia Survo-ristikoita ratkaistavaksi vaihtomenetelmällä.
* * *
Sukro /SP_SWAP edellyttää, että ratkaistava Survo-ristikko talletetaan
Survossa matriisina. Esim. tehtävä
* * * * 14
* * * * 28
* * * * 44
* * * * 50
16 33 40 47
talletetaan muodossa
MAT SAVE AS A
0 0 0 0 14
0 0 0 0 28
0 0 0 0 44
0 0 0 0 50
16 33 40 47 0
ja sukro käynnistetään komennolla
/SP_SWAP A
Tässä on muutamia tehtäviä, joita voi yrittää ratkaista vaihtomenetelmällä:
Tehtävä S0: (ratkeaa suoraan)
MAT SAVE AS A
0 0 0 0 15
0 0 0 0 32
0 0 0 0 41
0 0 0 0 48
14 33 38 51 0
Tehtävä S1: (ratkeaa kolmella siirrolla)
MAT SAVE AS A
0 0 0 0 48
0 0 0 0 43
0 0 0 0 34
0 0 0 0 11
47 41 30 18 0
Tehtävä S2: (4 siirtoa)
MAT SAVE AS A
0 0 0 0 55
0 0 0 0 44
0 0 0 0 23
0 0 0 0 14
45 39 29 23 0
Tehtävä S3:
MAT SAVE AS A
0 0 0 0 0 27
0 0 0 0 0 37
0 0 0 0 0 56
9 17 24 31 39 0
Tehtävä S4:
MAT SAVE AS A
0 0 0 0 57
0 0 0 0 41
0 0 0 0 27
0 0 0 0 11
44 36 31 25 0
Tehtävä S5:
MAT SAVE AS A
0 0 0 0 56
0 0 0 0 38
0 0 0 0 31
0 0 0 0 11
45 37 32 22 0
* * *
Vaihtojen lukumäärän jakauman laskeminen satunnaiselle permutaatiolle
Vaihtojen lukumäärän jakaumaa ei yleisesti kannata lähteä laskemaan
määräämällä tuo lukumäärä kullekin permutaatiolla erikseen, koska
4x4-ristikoiden tapauksessa niitä on fact(16)=20922789888000 kappaletta.
Vaikka sekunnissa saisi laskettua miljoona tapausta, koko laskentaan
kuluisi yli puoli vuotta.
Näytän, miten Survon matriisi- ja "polynomi"-tulkin avulla jakauma
saadaan selville tarkkaan numeerisesti hyvin nopeasti. On hyvä
matemaattinen harjoitustehtävä osoittaa, miksi näin saadaan
haluttu tulos.
Tarkastellaan tuloa (x-1)*(x-2)*(x-3)*...*(x-15) ja kehitetään
se polynomiksi s0+s1*x+s2*x^2+...+s15*x^15.
Kertoimet s0,s1,s2,s3,...,s15 ovat tällöin ns. Stirlingin ensimmäisen
lajin lukuja ja niiden itseisarvot jaettuna luvulla 16! ilmaisevat
käänteisessä järjestyksessä vaihtojen lukumäärän jakauman pistetoden-
näköisyydet.
Laskenta tapahtuu tällöin Survolla esim. näin:
Muodostetaan tarvittavien polynomien (binomien) kerroinvektorit:
MAT SAVE AS P
-1
1
MAT SAVE AS P2
-2
1
MAT SAVE AS P3
-3
1
sama arvoilla 4-15 eli siis viimeisenä
MAT SAVE AS P15
-15
1
Lasketaan binomien tulo:
POL P=P*P2
POL P=P*P3
POL P=P*P4
POL P=P*P5
POL P=P*P6
POL P=P*P7
POL P=P*P8
POL P=P*P9
POL P=P*P10
POL P=P*P11
POL P=P*P12
POL P=P*P13
POL P=P*P14
POL P=P*P15
MAT TRANSFORM P BY abs(X#)
Tulostetaan kertoimien s0,s1,...,s15 itseisarvot, tarkistetaan
(kosketuslaskennalla) niiden summa (joka on siis 16!) ja jakamalla
sillä saadaan jakauman pistetodennäköisyydet:
MAT LOAD P,12345678901245,CUR+1
MATRIX P
Polynom
/// real todennäköisyys vaihtojen lukumäärä
0 1307674368000 0.06250000000000 15
1 4339163001600 0.20738931207681 14
2 6165817614720 0.29469385525189 13
3 5056995703824 0.24169796336407 12
4 2706813345600 0.12937153028299 11
5 1009672107080 0.04825704948933 10
6 272803210680 0.01303856761648 9
7 54631129553 0.00261108245341 8
8 8207628000 0.00039228171979 7
9 928095740 0.00004435812552 6
10 78558480 0.00000375468474 5
11 4899622 0.00000023417632 4
12 218400 0.00000001043838 3
13 6580 0.00000000031449 2
14 120 0.00000000000574 1
15 1 0.00000000000005 0
20922789888000
Tästä saadaan (edelleen kosketuslaskennalla) jakauman odotusarvo
ja hajonta:
m=12.619271006771 (odotusarvo)
S2=161.04238320212 (neliöiden painotettu summa)
s=sqrt(S2-m^2) s=1.3402919308079 (hajonta)
* * *
Esimerkki tehtävästä, joka edellyttää "uhrausta"
* * * * 49 vaikeusaste=1700
* * * * 39
* * * * 33
* * * * 15
49 43 29 15
Vaihtomenettelyn alkuasetelma on tällöin
C1 C2 C3 C4 Sum OK D
R1 16 15 11 7 49 49 0
R2 14 13 9 4 40 39 1
R3 12 10 8 3 33 33 0
R4 6 5 2 1 14 15 -1
Sum 48 43 30 15
OK 49 43 29 15 W=4
D -1 0 1 0
eli W on ainoastaan 4, mutta ristikko ei ratkea tästä suoraan
yhdellä tai parilla vaihdolla.
Koska minimisummat ovat molemmat suuruudeltaan 15, kannattaa
tarkastella niiden mahdollisia osituksia:
COMB P,CUR+1 / P=PARTITIONS,15,4 DISTINCT=1
Partitions 4 of 15: N[P]=6
1 2 3 9
1 2 4 8
1 2 5 7
1 3 4 7
1 3 5 6
2 3 4 6
Ainoat yhteensopivat ositusvaihtoehdot ovat silloin
8 4 2 1 - 6 5 3 1
7 5 1 2 - 6 4 3 2
ja näistä ensimmäinen pari on lähempänä alkuasetelmaa.
Kannattaa siis aloittaa vaihdoilla (2,3) ja (7,8), jolloin
viimeinen rivi ja sarake saadaan summiltaan oikeiksi, mutta
W kasvaa arvoon 6 (uhraus!)
C1 C2 C3 C4 Sum OK D
R1 16 15 11 8 50 49 1
R2 14 13 9 4 40 39 1
R3 12 10 7 2 31 33 -2
R4 6 5 3 1 15 15 0
Sum 48 43 30 15
OK 49 43 29 15 W=6
D -1 0 1 0
Nyt on helppo havaita, että vaihdot (12,13) ja (10,11)
vievät lopputulokseen
C1 C2 C3 C4 Sum OK D
R1 16 15 10 8 49 49 0
R2 14 12 9 4 39 39 0
R3 13 11 7 2 33 33 0
R4 6 5 3 1 15 15 0
Sum 49 43 29 15
OK 49 43 29 15 W=0
D 0 0 0 0
eli tehtävä on ratkaistu 4 siirrolla.