Kahdeksan kuningattaren ongelma
Malline:Shakkilauta Kahdeksan kuningattaren ongelma on klassinen kombinatoriikan ongelma, jossa tehtävänä on asettaa kahdeksan kuningatarta shakkilaudalle siten, etteivät mitkään kaksi kuningatarta uhkaa toisiaan; toisin sanoen mitkään kaksi kuningatarta eivät saa olla samalla vaakarivillä, pystylinjalla tai diagonaalilla. Yleisemmässä versiossa on n kuningatarta asetettava n×n ruudun laudalle. Tämä on aina mahdollista, jos n = 1 tai n ≥ 4, mutta ei onnistu jos n on 2 tai 3.[1] Ongelmaa ovat tutkineet useat tunnetut matemaatikot, muun muassa Gauss, Lucas ja Pólya, ja se on myös usein käytetty algoritmiikan esimerkkitapaus.[2]
Historia
Vuonna 1848 nimimerkki ”Schachfreund” eli saksalainen shakkitehtävien laatija Max Bezzel julkaisi kahdeksan kuningattaren ongelman Schachzeitung-lehdessä. Kaksi ratkaisua löydettiin jo vuonna 1849. Ongelma levisi laajempaan tietoisuuteen, kun Franz Nauck esitti sen Illustrirte Zeitungissa 1. kesäkuuta 1850. Carl Friedrich Gauss kiinnostui ongelmasta, löysi 72 ratkaisua ja totesi, että ratkaisuja voi olla enemmänkin. Syyskuussa 1850 Nauck esitti ongelmaan 12 perusratkaisua, joista kiertämällä ja peilaamalla saadaan yhteensä 92 ratkaisua.[3][4] Vuonna 1874 James W. L. Glaisher todisti, ettei ratkaisuja ole enempää kuin nämä 92.[5] Glaisherin menetelmä perustuu rekursioon, jossa n kuningattaren ratkaisuista n×n ruudun laudalla pystytään päättelemään n+1 kuningattaren ratkaisut (n+1)×(n+1) ruudun laudalla.[6]
Algoritmiikan esimerkkiongelma
Kahdeksan kuningattaren ongelmaa käytetään usein havainnollistamaan erilaisia algoritmiikan tekniikoita, kuten peruuttavaa hakua (engl. backtracking). Edsger Dijkstra käytti sitä tässä tarkoituksessa vuonna 1971. Peruuttava haku voi toimia esimerkiksi siten, että asetetaan ensimmäinen kuningatar ensimmäiselle riville, vuoron perään kuhunkin kahdeksasta mahdollisesta ruudusta. Kussakin tapauksessa kokeillaan seuraavaksi mahdollisuudet asettaa toinen kuningatar toiselle riville jne.[7][8][9]
Ongelmaan on sovellettu lukuisia algoritmiikan menetelmiä, kuten hajota ja hallitse -menetelmiä, rajoiteohjelmointia (CSP), kokonaislukuoptimointia, satunnaisalgoritmeja, symmetrian eliminointia ja neuroverkkoja. Algoritmin tavoitteena voi olla joko löytää ainakin joitakin ratkaisuja, tai luetella ne kaikki.[2] Toisaalta pelkästään siihen, että löydetään jokin ratkaisu, ei tarvita lainkaan algoritmiikkaa eikä hakua, sillä mille tahansa n ≥ 4 voidaan eräs ratkaisu muodostaa yksinkertaisella menetelmällä.[10]
Ratkaisujen olemassaolo ja konstruktio
Kahdeksan kuningattaren ongelma on klassinen ongelma, jonka kaikki 92 ratkaisua on tunnettu pitkään. Myös n kuningattaren ongelma on ratkaistu siinä mielessä, että ratkaisuja tunnetaan kaikilla n:n arvoilla (kun n ≥ 4).[11] Todistuksen sille, että ratkaisuja on aina olemassa, esitti ilmeisesti ensimmäisenä E. Pauls vuonna 1874. Yleisiä ratkaisuja on sittemmin esitetty useitakin.[10]
Seuraava yksinkertainen konstruktio on Hoffmanin, Loessin ja Mooren vuonna 1969 esittämä. Konstruktio jakautuu tapauksiin sen mukaan, mikä on jakojäännös kun n jaetaan kuudella.[1][10]
- Jos , asetetaan kuningattaret paikkoihin sekä , kaikilla .
- Jos , asetetaan kuningattaret paikkoihin sekä , kaikilla .
- Jos n on pariton, otetaan kuningattaren ratkaisu ja lisätään kuningatar paikkaan .
Kuvassa konstruktiot tapauksissa . Tällä konstruktiolla voidaan kuningattaret asettaa helposti mielivaltaisen suurelle laudalle, esimerkiksi 1 000 kuningatarta 1 000 × 1 000 ruudun laudalle.
Malline:Shakkilauta 4x4Malline:Shakkilauta 5x5Malline:Shakkilauta 6x6Malline:Shakkilauta 7x7
Ratkaisujen lukumäärä
Erilaisten ratkaisujen lukumäärän laskeminen on vaikeampi ongelma, eikä lukumäärälle tunneta yksinkertaista kaavaa.[12] Pienissä tapauksissa ratkaisut voidaan luetella peruuttavalla haulla ja sitä kautta laskea niiden lukumäärä. 16 kuningattaren ratkaisujen (14 772 512 kpl) luetteleminen noin 10-rivisellä C-ohjelmalla vie noin minuutin nykyaikaisella tietokoneella (vuonna 2018).[9] 25 kuningattaren ratkaisut laskettiin vuonna 2005 hajautetulla laskennalla tavallisilla toimistotietokoneilla. 26 kuningattaren ratkaisut laskettiin vuonna 2009 ohjelmoitavilla FPGA-logiikkapiireillä Queens@TUD-projektissa noin yhdeksän kuukauden aikana.[13]
Nykyään ratkaisujen lukumäärä tunnetaan 27 kuningattaren ongelmaan saakka, johon on noin ratkaisua, tai jos toisistaan kiertämällä ja peilaamalla saatavia ratkaisuja pidetään samoina.[14][15] Ratkaisut laskettiin hajautetusti usealla tuhannella FPGA-logiikkapiirillä. Laskentaa varten ongelma pilkottiin noin kahteen miljardiin osaongelmaan. Yksittäisen osaongelman ratkaisemiseen FPGA-piirillä meni keskimäärin vajaa minuutti, joten laskentaa tehtiin yhteensä yli 3 500 vuotta. Hajautettu laskenta kesti noin vuoden: se alkoi syyskuussa 2015 ja valmistui syyskuussa 2016.[12][13]
Ratkaisujen lukumäärät n:n eri arvoilla on lueteltu OEIS-tietokannassa.[14][15]
Muunnelmia
Malline:Shakkilauta Kahdeksan tai n:n kuningattaren ongelmasta tunnetaan useita muunnelmia. Täydentämisongelmassa (engl. n-Queens Completion) laudalle on valmiiksi asetettu joukko kuningattaria, ja on ratkaistava, voiko asetelman täydentää niin, että laudalla on n kuningatarta, jotka eivät uhkaa toisiaan. Nauck esitti vuonna 1850 kahdeksan kuningattaren täydentämisongelman tapauksen, jossa kaksi kuningatarta oli asetettu ruutuihin B4 ja D5. Gent, Jefferson ja Nightingale osoittivat n kuningattaren täydentämisongelman NP-täydelliseksi vuonna 2017.[11][16][17] Joissakin uutisissa tämä tulos selitettiin virheellisesti niin, että kahdeksan tai n kuningattaren ongelman ratkaisemisesta saisi Clay-instituutin miljoonan dollarin Millennium-palkinnon. Gent ja Clay-instituutti joutuivat julkaisemaan selvennyksen, että näiden ongelmien ratkaisuja tunnetaan ennestään. Millennium-palkinto on luvassa P=NP-ongelman ratkaisemisesta, esimerkiksi sen selvittämisestä, onko n kuningattaren täydentämisongelma mahdollista ratkaista polynomisessa ajassa.[18][11][19]
Pólya tutki toroidaalista kuningatarongelmaa, jossa shakkilaudan reunaan osuva diagonaali jatkuu vastakkaisesta reunasta, ikään kuin lauta olisi taivutettu rullalle ja vastakkaiset reunat liimattu yhteen. Toisin sanoen laudan ruutujen koordinaatteihin sovelletaan modulaarista aritmetiikkaa. Tämä tekee ongelman matemaattisesti yksinkertaisemmaksi ja symmetrisemmäksi, ja vähentää ratkaisujen lukumäärää huomattavasti. Toroidaaliseen ongelmaan on olemassa ratkaisuja ainoastaan silloin, kun . Ratkaisujen lukumäärä tunnetaan tapaukseen asti, jossa ratkaisuja on noin kappaletta.[10][12][20]
Muita muunnelmia ovat muun muassa korkeampiulotteiset laudat sekä kuningattaren korvaaminen jollakin muulla shakkinappulalla. Tornien tapauksessa ratkaisu on yksinkertainen: n×n ruudun laudalle voi asettaa n tornia siten, että kukin torni on omalla rivillään ja tornien linjat ovat mikä tahansa joukon permutaatio; ratkaisujen lukumäärä on siten eli n:n kertoma.[10][12]
Lähteet
- ↑ 1,0 1,1 Viittausvirhe: Virheellinen
<ref>-elementti; viitettähoffmanei löytynyt - ↑ 2,0 2,1 Viittausvirhe: Virheellinen
<ref>-elementti; viitettäerbasei löytynyt - ↑ Viittausvirhe: Virheellinen
<ref>-elementti; viitettäcampbellei löytynyt - ↑ Viittausvirhe: Virheellinen
<ref>-elementti; viitettägardnerei löytynyt - ↑ Viittausvirhe: Virheellinen
<ref>-elementti; viitettärivinei löytynyt - ↑ Viittausvirhe: Virheellinen
<ref>-elementti; viitettäballei löytynyt - ↑ Viittausvirhe: Virheellinen
<ref>-elementti; viitettädijkstraei löytynyt - ↑ Viittausvirhe: Virheellinen
<ref>-elementti; viitettäneapolitanei löytynyt - ↑ 9,0 9,1 Viittausvirhe: Virheellinen
<ref>-elementti; viitettälaaksonenei löytynyt - ↑ 10,0 10,1 10,2 10,3 10,4 Viittausvirhe: Virheellinen
<ref>-elementti; viitettäbellei löytynyt - ↑ 11,0 11,1 11,2 Viittausvirhe: Virheellinen
<ref>-elementti; viitettäclayei löytynyt - ↑ 12,0 12,1 12,2 12,3 Viittausvirhe: Virheellinen
<ref>-elementti; viitettäpreusserei löytynyt - ↑ 13,0 13,1 Viittausvirhe: Virheellinen
<ref>-elementti; viitettäq27ei löytynyt - ↑ 14,0 14,1 Viittausvirhe: Virheellinen
<ref>-elementti; viitettäoeisei löytynyt - ↑ 15,0 15,1 Viittausvirhe: Virheellinen
<ref>-elementti; viitettäoeis2ei löytynyt - ↑ Viittausvirhe: Virheellinen
<ref>-elementti; viitettägentei löytynyt - ↑ Viittausvirhe: Virheellinen
<ref>-elementti; viitettänauckei löytynyt - ↑ Viittausvirhe: Virheellinen
<ref>-elementti; viitettägent2ei löytynyt - ↑ Viittausvirhe: Virheellinen
<ref>-elementti; viitettämtv3ei löytynyt - ↑ Viittausvirhe: Virheellinen
<ref>-elementti; viitettäoeis3ei löytynyt