Kahdeksan kuningattaren ongelma

testwikistä
Versio hetkellä 27. elokuuta 2023 kello 16.48 – tehnyt imported>InternetArchiveBot (Pelastettu 1 lähde(ttä) ja merkitty 0 kuolleeksi.) #IABot (v2.0.9.5)
(ero) ← Vanhempi versio | Nykyinen versio (ero) | Uudempi versio → (ero)
Siirry navigaatioon Siirry hakuun

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 mod(n,6)=0 tai 4, asetetaan kuningattaret paikkoihin (j,2j) sekä (n/2+j,2j1), kaikilla 1jn/2.
  • Jos mod(n,6)=2, asetetaan kuningattaret paikkoihin (j,1+mod(2(j1)+n/21,n)) sekä (n+j1,nmod(2(j1)+n/21,n)), kaikilla 1jn/2.
  • Jos n on pariton, otetaan n1 kuningattaren ratkaisu ja lisätään kuningatar paikkaan (n,n).

Kuvassa konstruktiot tapauksissa n=4,5,6,7. 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

Malline:Clear

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 2,3491017 ratkaisua, tai 2,9361016 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 mod(n,6)=1 tai 5. Ratkaisujen lukumäärä tunnetaan tapaukseen n=31 asti, jossa ratkaisuja on noin 1,3401013 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 {1,2,,n} permutaatio; ratkaisujen lukumäärä on siten n! eli n:n kertoma.[10][12]

Lähteet

Malline:Viitteet

  1. 1,0 1,1 Viittausvirhe: Virheellinen <ref>-elementti; viitettä hoffman ei löytynyt
  2. 2,0 2,1 Viittausvirhe: Virheellinen <ref>-elementti; viitettä erbas ei löytynyt
  3. Viittausvirhe: Virheellinen <ref>-elementti; viitettä campbell ei löytynyt
  4. Viittausvirhe: Virheellinen <ref>-elementti; viitettä gardner ei löytynyt
  5. Viittausvirhe: Virheellinen <ref>-elementti; viitettä rivin ei löytynyt
  6. Viittausvirhe: Virheellinen <ref>-elementti; viitettä ball ei löytynyt
  7. Viittausvirhe: Virheellinen <ref>-elementti; viitettä dijkstra ei löytynyt
  8. Viittausvirhe: Virheellinen <ref>-elementti; viitettä neapolitan ei löytynyt
  9. 9,0 9,1 Viittausvirhe: Virheellinen <ref>-elementti; viitettä laaksonen ei löytynyt
  10. 10,0 10,1 10,2 10,3 10,4 Viittausvirhe: Virheellinen <ref>-elementti; viitettä bell ei löytynyt
  11. 11,0 11,1 11,2 Viittausvirhe: Virheellinen <ref>-elementti; viitettä clay ei löytynyt
  12. 12,0 12,1 12,2 12,3 Viittausvirhe: Virheellinen <ref>-elementti; viitettä preusser ei löytynyt
  13. 13,0 13,1 Viittausvirhe: Virheellinen <ref>-elementti; viitettä q27 ei löytynyt
  14. 14,0 14,1 Viittausvirhe: Virheellinen <ref>-elementti; viitettä oeis ei löytynyt
  15. 15,0 15,1 Viittausvirhe: Virheellinen <ref>-elementti; viitettä oeis2 ei löytynyt
  16. Viittausvirhe: Virheellinen <ref>-elementti; viitettä gent ei löytynyt
  17. Viittausvirhe: Virheellinen <ref>-elementti; viitettä nauck ei löytynyt
  18. Viittausvirhe: Virheellinen <ref>-elementti; viitettä gent2 ei löytynyt
  19. Viittausvirhe: Virheellinen <ref>-elementti; viitettä mtv3 ei löytynyt
  20. Viittausvirhe: Virheellinen <ref>-elementti; viitettä oeis3 ei löytynyt