A metódusok vizsgálata

 

A feladványok megoldása lapokon többek között a jelöltek számának csökkentésére alkalmas metódusokat, eljárásokat ismerhettük meg. Megadtam egy-egy lehetséges implementációját is. A metódusokat most olyan szempontból vizsgálom meg, hogy egy adatbázis feladványain milyen sebességgel és milyen eredményességgel alkalmazhatók. Azért, hogy a metódusok leírását ne kelljen az előző lapokról megnézni, most itt megismétlem:

 

Hidden Singles (HS): Ha egy sorban, egy oszlopban vagy egy tartományban csak egyetlen cellában van egy adott jelölt, akkor a cellába ez a jelölt beírható, és a szoba további celláiból a jelölt törölhető.

 

Pointing Pairs (PP): Ha egy tartományban egy jelölt csak két helyen van, de egy sorban vagy egy oszlopban, akkor a jelölt – a kijelölt teljes sorban vagy oszlopban – a többi helyről törölhető.

 

Naked Pairs (NP): Ha egy szobának két cellájában csak ugyanaz a két jelölt van, akkor a szoba többi cellájából (a kijelölt sorból vagy oszlopból, és ha egy tartományban vannak, akkor tartományból is) ezek a jelöltek törölhetők.

 

Hidden Pairs (HP): Ha egy szobában csak két cellában van ugyanaz a két jelölt (de más még lehet), akkor a szoba ezen két mezőjéből minden más jelölt törölhető.

 

Pointing Triples (PT): Ha egy tartományban egy jelölt csak három helyen van, de egy sorban vagy egy oszlopban, akkor a kijelölt sorban vagy oszlopban a többi helyről a jelölt törölhető.

 

Naked Triples (NT): Ha egy szobában, három cellában (egy sorban, egy oszlopban vagy egy tartományban) van csak ugyanaz a három jelölt, akkor a többi cellából ezek a jelöltek törölhetők.

 

Hidden Triples (HT): Ha egy szobában csak három cellában (egy sorban, egy oszlopban vagy egy tartományban) található három jelölt (de más még lehet), akkor a szoba ezen három mezőjéből minden más jelölt törölhető.

 

Naked Quads (NQ): Ha egy szobában van olyan négy nem üres cella (egy sorban, egy oszlopban vagy egy tartományban), amelyben összesen négy jelölt van, akkor a többi helyről ezek a jelöltek törölhetők.

 

Hidden Quads (HQ): Ha egy szobában csak négy cellában (értelemszerűen egy sorban, egy oszlopban vagy egy tartományban) található négy jelölt (de más jelölt még lehet), akkor ezen négy cellából a többi jelölt törölhető.

 

Box Line Reduction Pairs (BP): Ha egy oszlopban vagy sorban egy szám kétszer egy tartományon belül ismétlődik, és csak kétszer szerepel az oszlopban vagy sorban, akkor a tartományon belül a többi helyről törölhető.

 

Box Line Reduction Triples (BT): Ha egy oszlopban vagy sorban egy jelölt háromszor egy tartományon belül ismétlődik, és csak háromszor szerepel az oszlopban vagy sorban, akkor a tartományon belül a többi helyről törölhető.

 

X-Wing (XW): Ha két jelölt két oszlopban pontosan kétszer-kétszer szerepel, de ugyanabban a két sorban, akkor a két sor további helyeiről a jelölt törölhető.

 

Y-Wing (YW): Ha három jelölt (legyenek: A, B és C) úgy helyezkedik el egy derékszögű háromszög csúcsainak megfelelő cellákban, hogy mindegyikben pontosan kettő, de bármely két cella jelöltjei között csak egy közös található (azaz: A és B, A és C valamint B és C), akkor a hegyesszögű csúcsok sorának illetve oszlopának metszésében lévő cellából a hegyesszögű csúcsokban lévő cellák közös jelöltje törölhető.

 

Válasszunk egy olyan adatbázist, amelyben különböző elemszámú és nehézségi fokú feladványok találhatók. Ilyen például a D.gsf (7486):

 

 

Látható, hogy az elemszámok 20 és 29 között, a nehézségi fokok 1 és 32 között változnak. A kézi megoldót kiegészítettem egy Metódus kontroll funkcióval, mely a kiválasztott metódust alkalmazza az adatbázis összes feladványán, megjegyzi és összeszámolja, hogy hány feladvány esetén volt eredményes és a vizsgálat mennyi ideig tartott. Lássuk ezt a Naked Triples esetére:

 

 

Az eredmény: 636 feladványban volt eredményes (csökkentette a jelöltek számát) és 10 s volt a vizsgálat ideje. Módszeresen végigvizsgáltam az adatbázist az összes metódussal. Az eredményt egy táblázatban rögzítettem:

 

 

Rövid elemzéssel megállapíthatjuk, hogy három metódus (HS, NT és YW) ugyanolyan, a legnagyobb sebességgel haladt végig az adatbázison. Ugyanakkor a legeredményesebb a HS, és a legeredménytelenebb az YW is ezek között volt. A legkisebb sebességűnek a HQ bizonyult. Eredményesség szempontjából a BP lett a második helyezett és a PP a harmadik. Miért lehetnek érdekesek ezek az eredmények? Egyrészt ha a metódus lassan dolgozott (HQ), akkor meg lehet vizsgálni a kódját, hátha javíthatunk rajta. Másrészt, ha a kódot már nem gondoljuk javíthatónak, akkor a feladványok generálásánál olyan metódusokat célszerű választani, amelyek eredményessége magas, ha a minél rövidebb gépi idő alatt minél több feladvány elérése a cél. Különösen fontos ez az alacsony elemszámú feladványok (például minimum Sudoku) generálásakor.

 

         Nagyon nyilvánvaló, hogy a metódusok között kereszthatás lehetséges, amennyiben egynél több aktív a feladvány elemzésénél. Most ezzel foglalkozzunk egy kicsit. Ehhez a D-20.gsf (3427)-es adatbázist fogjuk használni. Most nem a futási idő, hanem az eredményes esetek száma lesz az érdekes. Mivel 13 metódusból nagyon sokféleképpen lehet néhányat kiválasztani, a teljes elemzéstől most eltekintek (szerintem értelme sem lenne). Néhány páros kiválasztás mellett egy háromszoros kiválasztást is megvizsgálok.

 

         Nézzük meg a két legeredményesebb és leggyorsabb metódus hatását az adatbázison (HS és BP):

 

 

Ez szép, majdnem 100%-os az eredmény.

 

 

Ez sem rossz a maga 77%-ával.

 

Most nézzük meg, mi történik akkor, ha minkét metódus aktív és a BP értékelődik ki másodjára:

 

 

Most pedig fordítva, a HS kiértékelése lesz később:

 

 

Látható, hogy BP egyedül a legrosszabb a négy eset közül. Ha a HP értékelődik ki később, akkor 21 lehetőséget veszített, ha pedig a BP, akkor viszont a BP 90 lehetőséget nyer.

 

Most nézzünk meg még egy párt: a PP és az NP-t ugyanúgy, mint azt a legjobbakkal tettük:

 

 

Ez egy 95%-os eredmény.

 

 

Ez egy sokkal szerényebb, csak 12% körüli

 

Most nézzük az együttes hatásukat, amikor az NP lesz később kiértékelve:

 

 

Ez 16%, ami 4%-os javulást jelent. Most pedig nézzük fordítva:

 

 

Itt minimális a csökkenés az egyedüli (PP) vizsgálathoz képest.

 

Végül nézzünk még egy esetet. Mi történik, ha a három érintett metódus a PP, NP és a HP. Mivel a HP-t még nem láttuk önmaga, először ezt nézzük meg:

 

 

Ha a HP értékelődik ki utoljára, akkor ezt látjuk:

 

 

Ha a háromból a PP lesz az utolsó, akkor ezt az eredményt kapjuk:

 

 

         Látható, hogy ha a PP-t hagyjuk utolsónak, akkor sokkal jobban járunk, mintha a HP-t. És az is látható, hogy PP önmagában hatékonyabb (fentebbiek szerint: 3252), mint a további metódusokkal. Ellenben a HP-nek jót tett a másik kettő, hiszen önmaga csak 1935 esetet produkált, a társakkal együtt viszont 1945-öt. Nem nagy javulás, de javulás.

 

Már ennyi vizsgálatból is leszűrhetjük a tanulságot: a metódusok között jelentős kereszthatások léteznek és még az sem mellékes, hogy egy feladványon milyen sorrend szerint történik a kiértékelés.

 

         Még egy felvetés a metódusokkal kapcsolatban. Miért van rájuk szükség, hiszen ott a BackTrak algoritmus, azzal minden megoldható feladvány biztosan megoldható, miért nem azt használjuk. Ennek roppant egyszerű oka van, mert nagyon lassú. Ennek érzékeltetésére bemutatnék egy feladványt. Tekintsük a 18-A.gsf (83950) adatbázis 34-edik feladványát:

 

 

         Ez a feladvány az SH segítségével a másodperc töredéke alatt megoldható:

 

 

Nézzük meddig tart mindez a BackTrak algoritmusnak:

 

 

Jól látható, hogy a BTR-nek 3.357.087.224 elemi lépésre (egy szám beírása egy helyre) és 259 másodpercre volt szüksége. A BTR-t tehát csak ott és csak akkor szabad használni, ahol az elkerülhetetlen. Egyébként a 83950 feladványból csak az első 34-et teszteltem (valószínű, hogy még hosszabb futási idejű is van köztük). A többségét 1-10 másodperc alatt megoldotta a BTR, de volt még 33 és 69 másodperces futási idejű is. Egy feladvány generálásánál másodpercenként több százszor kell a feladványkezdeményt megpróbálni megoldani a feladványkészítőnek ahhoz, hogy értelmes idő alatt feladványt tudjon előállítani. Belátható, hogy ehhez a BTR teljes mértékben alkalmatlan, kellenek a megfelelően megválasztott metódusok.

 

A BTR rutinja:

 

Function Utkozik(TT: TTomb; H: Word): Boolean;  //BTR-nek
Var I: Word;
Begin
  Utkozik:= FalseIf TT[H]=0 Then Begin Utkozik:= FalseExit End;
  For I:= 1 To 20 Do If TT[H]=TT[SzT[H,I]] Then Begin Utkozik:= TrueExit End;
End;

procedure BTR;
Var I: Word;
    L, LMax: Int64;
begin
  LMax:= 10000000000;
  SC:= SM;
  I:= 1; L:= 0; //novekvo normal
  While (I In [1..MX]) And (L<=LMaxDo
  Begin
    Inc(L); If L>LMax Then L:= 1;
    If (L Mod 10000000=0) Then Begin edN.Text:= IntToStr(L); edN.RePaint End;
    While SC[I]>0 Do Inc(I); Inc(SM[I]);
    If SM[I]>Max Then Begin SM[I]:= 0; Dec(I); While SC[I]>0 Do Dec(I) End
    Else If Not Utkozik(SM,I) Then Begin Inc(I); While SC[I]>0 Do Inc(I) End;
  End;
  SA:= SM;
end;