Generowanie planszy SUDOKU o zadanym stopniu trudności

Podobne dokumenty
Algorytmy sztucznej inteligencji

Materiał wykorzystany ze stron: SUDOKU

AiSD zadanie trzecie

Optymalizacja systemów

Maciej Piotr Jankowski

Optymalizacja systemów

Programowanie genetyczne, gra SNAKE

REFERAT PRACY DYPLOMOWEJ Temat pracy: SUDOKU - Algorytmy tworzenia i rozwiązywania

TEORETYCZNE PODSTAWY INFORMATYKI

Scenariusz zajęć. Moduł VI. Projekt Gra logiczna zgadywanie liczby

Programowanie w Baltie klasa VII

XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery

OSTASZEWSKI Paweł (55566) PAWLICKI Piotr (55567) Algorytmy i Struktury Danych PIŁA

Programowanie i techniki algorytmiczne

Word. Korespondencja seryjna

Propozycje tematów zadań

Mikroekonometria 5. Mikołaj Czajkowski Wiktor Budziński

I Łukowski Turniej Szkół Gimnazjalnych "SUDOKU 2011"

Metody numeryczne Wykład 4

Algorytm genetyczny (genetic algorithm)-

Programowanie dynamiczne cz. 2

Wykład 3. Metoda dziel i zwyciężaj

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Klasyczne zagadnienie przydziału

Pomorski Czarodziej 2016 Zadania. Kategoria C

Teoretyczne podstawy informatyki

WOJEWÓDZTWO PODKARPACKIE

Stosowanie, tworzenie i modyfikowanie stylów.

OSTASZEWSKI Paweł (55566) PAWLICKI Piotr (55567) Algorytmy i Struktury Danych PIŁA

Szukanie rozwiązań funkcji uwikłanych (równań nieliniowych)

Podstawy OpenCL część 2

Temat 20. Techniki algorytmiczne

Scenariusz zajęć z matematyki dla klasy I gimnazjum z wykorzystaniem programu edurom Matematyka G1

Struktury Danych i Złożoność Obliczeniowa

Ile waży arbuz? Copyright Łukasz Sławiński

VII Mistrzostwa Dolnego Śląska w Sudoku - Eliminacje SP7/GIM/LIC str. 1. imię i nazwisko:... kl... szkoła:... 6 pkt. 3 pkt 4 pkt.

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

Wyszukiwanie binarne

Systemy operacyjne. Laboratorium 9. Perl wyrażenia regularne. Jarosław Rudy Politechnika Wrocławska 28 lutego 2017

Algorytmika i pseudoprogramowanie

5.4. Tworzymy formularze

Algorytmy i struktury danych

D O K U M E N T A C J A

Scenariusz lekcji opartej na programie Program nauczania informatyki w gimnazjum DKW /99

dr inż. Jarosław Forenc

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Instrukcja obsługi Nowego Punktatora

VI PUCHAR POLSKI W ROZWIĄZYWANIU ŁAMIGŁÓWEK. 13 grudnia 2009

Budowa i generowanie planszy

Badania operacyjne: Wykład Zastosowanie kolorowania grafów w planowaniu produkcji typu no-idle

PRZYKŁADOWY TEST EGZAMINACYJNY

idream instrukcja do gry klasowej z rankingiem

Część 11. Rozwiązywanie problemów.

MATEMATYKA WYMAGANIA EDUKACYJNE DLA KLASY V

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

Zapisywanie algorytmów w języku programowania

Metody eksploracji danych w odkrywaniu wiedzy (MED) projekt, dokumentacja końcowa

Założenia funkcjonalne narzędzia informatycznego wspierającego wdrożenie benchmarkingu

KOMBINATORYKA. Problem przydziału prac

lekcja 8a Gry komputerowe MasterMind

Scenariusz lekcji. rozpoznać prawidłową deklarację tablicy; podać odwołanie do określonego elementu tablicy.

Dokumentacja programu. Zoz. Uzupełnianie kodów terytorialnych w danych osobowych związanych z deklaracjami POZ. Wersja

Mikroekonometria 6. Mikołaj Czajkowski Wiktor Budziński

Kalipso wywiady środowiskowe

Zadanie Wstaw wykres i dokonaj jego edycji dla poniższych danych. 8a 3,54 8b 5,25 8c 4,21 8d 4,85

Instrukcja Arkusz ZSZ

13. Równania różniczkowe - portrety fazowe

Wprowadzenie do kombinatoryki

INSTRUKCJA OBSŁUGI PROGRAMU PRZEDSZKOLE (CZ.1)

Złożoność obliczeniowa zadania, zestaw 2

X MISTRZOSTWA POLSKI W SUDOKU INSTRUKCJE. 22 luty 2015 r. KILKA WAŻNYCH INFORMACJI:

WYKORZYSTANIE NARZĘDZIA Solver DO ROZWIĄZYWANIA ZAGADNIENIA Problem przydziału

AKADEMIA ŁAMANIA GŁOWY Część I KALEJDOSKOP --0--

Ekonometria - ćwiczenia 10

ALHE. prof. Jarosław Arabas semestr 15Z

REJESTRACJA PROJEKTÓW

Technologia informacyjna Algorytm Janusz Uriasz

1. Algorytmy przeszukiwania. Przeszukiwanie wszerz i w głąb.

Automatyczny dobór parametrów algorytmu genetycznego

Generatory pomocy multimedialnych

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10.

Temat 1: Pojęcie gry, gry macierzowe: dominacje i punkty siodłowe

Lista 6. Kamil Matuszewski 13 kwietnia D n =

Liczby losowe i pętla while w języku Python

Za pierwszy niebanalny algorytm uważa się algorytm Euklidesa wyszukiwanie NWD dwóch liczb (400 a 300 rok przed narodzeniem Chrystusa).

Algorytmy i struktury danych. Wykład 4

Metoda List Łańcuchowych

7. Zagadnienie parkowania ciężarówki.

WSKAZÓWKI DO WYKONANIA SPRAWOZDANIA Z WYRÓWNAWCZYCH ZAJĘĆ LABORATORYJNYCH

UMOWY INSTRUKCJA STANOWISKOWA

Podstawowe informacje potrzebne do szybkiego uruchomienia e-sklepu

Tworzenie formularzy w Microsoft Office Word 2007

Przyspieszenie obróbki CNC z edytorem ścieżki. narzędzia w ZW3D. ZW3D CAD/CAM Biała księga

AKADEMIA ŁAMANIA GŁOWY Część II KAKURO

Co to jest niewiadoma? Co to są liczby ujemne?

Ogólne zasady projektowania algorytmów i programowania

Księgowość Optivum. Jak zweryfikować poprawność kwot w zestawieniu budżetowym?

Scenariusz lekcji Ozobot w klasie: Ciąg Fibonacciego

6. Zagadnienie parkowania ciężarówki.

AKADEMIA ŁAMANIA GŁOWY Część III HITORI

Transkrypt:

Kamil Markuszewski 171016 Mateusz Mikłuszka 171016 Mikołaj Szkutnik 156545 Systemy wspomagania decyzji i symulacja komputerowa Generowanie planszy SUDOKU o zadanym stopniu trudności Wstępna data oddania: 21.01.2012 Data oddania: 21.01.2012

Spis treści 1. Wstęp... 3 1.1 Czym jest sudoku... 3 1.2 Odmiany sudoku... 3 2. Motywacja... 5 3. Opis modelu plansza sudoku... 6 3.1 Plansza... 6 3.2 Rozwiązywanie sudoku... 7 4. Opis problemu... 8 5. Użyte algorytmy generowania plansz... 9 5.1. Losowanie planszy... 9 5.2. Permutowanie kolumn i wierszy... 9 5.3 Usuwanie pól... 12 5.4 Usuwanie konkretnych pól... 13 6. Metryki trudności planszy... 14 7. Algorytmy rozwiązywania plansz... 15 7.1 Rule Based Solver... 15 7.2 Bactracking Solver... 16 8. Plan eksperymentu... 17 9. Wyniki eksperymentu... 18 10. Gra sudoku... 20 11. Podsumowanie... 21 10. Bibliografia... 22 2

1. Wstęp 1.1 Czym jest sudoku Sudoku to popularna łamigłówka logiczna. Dzisiejsza wersja sudoku jako powstała w Japonii. W języku japońskim sudoku to: - 数独 - sūji wa dokushin ni kagiru - cyfry muszą być pojedyncze Celem gry jest uzupełnienie wszystkich pól planszy składającej się z 81 kwadratów. Plansza ta jest podzielona na 9 kwadratów. Poprawnie rozwiązana plansza musi spełniać trzy warunki: - cyfry w kolumnie nie mogą się powtarzać - cyfry w rzędzie nie mogą się powtarzać - cyfry w kwadracie 3x3 nie mogą się powtarzać 1.2 Odmiany sudoku Ponieważ gra jest popularna powstały jej różne wariacje. Odmianami sudoku w tym projekcie się nie zajmiemy, ale przedstawimy je ze względu na ich interesującą naturę. Te i inne modyfikacje oryginalnej wersji gry przyczyniły się do jej uatrakcyjnienia i utrudnienia. 1. Sudoku klasyczne Rys 1.2.1. Przykładowa plansza klasycznego sudoku. 3

2. Sudoku samurai 5 kwadratów połączonych w kształcie litery X. Rys 1.2.2. Przykładowa plansza samurai sudoku. 3. Sudoku diagonalne Cyfry nie mogą się powtarzać również po przekątnej. 4. Sudoku trójwymiarowe Rys 1.2.3. Przykładowa plansza trójwymiarowego sudoku. 5. Sudoku killer Plansza nie ma wpisanych cyfr, ale ma sumę cyfr dla obszaru. Rys 1.2.4. Przykładowa plansza killer sudoku. 6. Magnetyczne sudoku Cyfry nie mogą powtarzać się na rogach kwadratów. 4

2. Motywacja Problemy algorytmiczne związane z grą sudoku można podzielić na dwie grupy: - rozwiązywanie plansz sudoku - generowanie plansz sudoku Rozwiązywanie plansz sudoku jest problemem stosunkowo prostym do zaimplementowania. Algorytmy potrafią w bardzo krótkim czasie rozwiązać każdą, nawet najbardziej skomplikowaną planszę. Algorytmy rozwiązywania dzielą się na deterministyczne i niedeterministyczne. Algorytmy niedeterministyczne są to algorytmy, których czas wykonywania nie zależy od trudności planszy wejściowej. Algorytmy te bardzo często wykonują się w mniej więcej stałym, bardzo krótkim czasie. Jednak są trudne do nauczenia dla człowieka. Wśród tych algorytmów znajdują się algorytmy metaheurystyczne, ich specyfika polega na losowaniu wyniku, który będzie zbliżony do optymalnego. W przypadku sudoku, gdzie prawidłowe jest tylko jedno rozwiązanie te algorytmy się nie sprawdzą. Mogą one bowiem utknąć w tak zwanym lokalnym ekstremum wyniku który dla danej błędnie rozwiązanej gałęzi możliwości będzie najlepszy. Algorytmy deterministyczne wykonują się w różnym czasie w zależności od trudności planszy wejściowej. Spośród tych algorytmów można wyróżnić grupę takich, które rozwiązują sposobami podobnymi do ludzkich. Tego typu algorytm może być więc przydatny do oceny trudności wygenerowanej planszy sudoku. Im więcej iteracji będzie potrzebował na rozwiązanie problemu tym trudniejszy dla człowieka jest problem. Generowanie plansz sudoku to problem z całkiem innego gatunku. Samo wygenerowanie planszy może nie byś skomplikowane, jednak inaczej jest gdy chcemy by ta plansza była odpowiednio trudna. Dodatkowo nie jest łatwo określić co znaczy że plansza jest trudna. W naszym projekcie zajmujemy się tym właśnie tematem. Skupimy się na generowaniu plansz na kilka sposobów, ale spróbujemy także ocenić ich poziom trudności. Cele projektu: - Implementacja 2-3 algorytmów generowania plansz - Zaplanowanie metryk określających poziom trudności wygenerowanej planszy - Implementacja deterministycznego algorytmu rozwiązywania sudoku - Zbadanie efektywności algorytmów generowania plansz pod różnymi względami 5

3. Opis modelu plansza sudoku 3.1 Plansza W naszym projekcie zajmujemy się klasyczną planszą sudoku składającą się z 81 kwadratów. W każdym kwadracie może znaleźć się cyfra 1-9. Gra polega na wypełnieniu całej planszy cyframi, tak by były zachowane dodatkowe warunki. Rys 3.1.1. Przykładowa plansza sudoku. Rysunek 3.1. przedstawia planszę sudoku. Jak widać jest to tablica 2 wymiarowa 9x9. Składa się ona z 81 kwadratów wypełnionych liczbami. Cała plansza jest podzielona na 9 mniejszych plansz 2 wymiarowych 3x3. Rys 3.1.2. Niepowtarzalność cyfr w kwadracie 3x3 Reguły jakie musi spełniać poprawnie wypełniona plansza: Cyfry w obrębie kwadratu 3x3 nie mogą się powtarzać (Rys 3.2.) Cyfry w kolumnie 1x9 nie mogą się powtarzać Cyfry w rzędzie 9x1 nie mogą się powtarzać Z tych reguł wynikają kolejne, które mogą pomóc w rozwiązaniu planszy: W każdym kwadracie 3x3 znajdują się wszystkie cyfry 1-9 W każdej kolumnie 1x9 znajdują się wszystkie cyfry 1-9 W każdym rzędzie 9x1 znajdują się wszystkie cyfry 1-9 Te dodatkowe reguły pomagają w prosty sposób wypełnić dany rząd, kolumnę, kwadrat jeśli jest w nim wiele uzupełnionych pól. Pomogą one również przy definiowaniu poziomu trudności planszy. 6

3.2 Rozwiązywanie sudoku Istnieją 3 podstawowe metody rozwiązywania sudoku którymi operują ludzie. Metody te to eliminacja, dopełnianie oraz oznaczanie. Oczywiście algorytmy rozwiązujące sudoku niekoniecznie na nich bazują. A te bazujące są wrażliwe na stopień trudności planszy. Niektóre z nich podobnie jak człowiek nie potrafią rozwiązać wszystkich plansz. Rozwiązywanie metodą eliminacji polega na wykluczaniu miejsc, w których może znaleźć się cyfra na podstawie rzędu, kolumny, kwadratu. Bazuje ona na zasadach Cyfry w kolumnie, rzędzie, kwadracie nie mogą się powtarzać. Rozwiązywanie metodą dopełnienia polega na uzupełnianiu brakujących cyfr w rzędzie, kolumnie wierszu. Bazuje na zasadach W każdym rzędzie, kolumnie, kwadracie znajdują się wszystkie cyfry 1-9. Dla rozwiązywania tą metodą najprostsze plansze to takie, w których najwięcej jest uzupełnionych pól w kolumnie, rzędzie, kwadracie. Rozwiązywanie metodą oznaczania polega na zaznaczaniu na planszy możliwych rozwiązań. Ludzie, rozwiązujący tą metodą po prostu zaznaczają możliwości na planszy. Algorytmy również wykorzystują tę metodę do określania zbioru kandydatów na pole. Jednym z przykładów może być zaimplementowany przez nas algorytm wykorzystujący backtacking. Algorytm ten po wygenerowaniu kandydatów próbuje dla każdej możliwości wstawić brakującą cyfrę, a gdy okaże się to złym rozwiązaniem wycofać zmiany. 7

4. Opis problemu Nasze zadanie polegało na zaimplementowaniu algorytmów generujących plansze sudoku. Algorytmy te zostały zbadane pod różnymi aspektami: czas działania, przydatność w generowaniu plansz, możliwość definiowania poziomu trudności. W celu oceny algorytmów musiały zostać zaimplementowane odpowiednie metryki poziomów trudności. Metryki te zostały opracowane przez nas. Bazują one na ludzkich sposobach rozwiązywania plansz. Algorytmy powinny potrafić wygenerować odpowiednio trudne plansze. Na koniec spróbujemy zaproponowanym przez nas algorytmem wygenerować planszę o zadanej przez nas trudności. Wygenerowana plansza aby była poprawna musi spełniać 2 warunki: - musi istnieć rozwiązanie - rozwiązanie może być tylko jedno W celu sprawdzenia czy istnieje rozwiązanie sudoku postanowiliśmy po prostu rozwiązać je algorytmem wykorzystującym backtracking. Algorytm ten zawsze znajduje rozwiązanie problemu. Jest to jednak algorytm bazujący na przeglądzie zupełnym, zatem jego czas wykonywania jest stosunkowo długi. W celu sprawdzenia czy rozwiązanie jest tylko jedno należało zrobić przegląd zupełny z zapamiętaniem możliwych ścieżek. Jeśli plansza może być rozwiązana na kilka sposobów nie jest poprawna. 8

5. Użyte algorytmy generowania plansz Do generowania plansz sudoku zaimplementowaliśmy 4 algorytmy. Niestety nie każdy z nich może działać samodzielnie, jednak każdy okazuje się pomocny. Niestety najmniej efektywny z algorytmów musi być podstawą do użycia pozostałych. Zaimplementowane algorytmy: - losowanie planszy - permutowanie kolumn i wierszy - usuwanie pól - usuwanie konkretnych pól 5.1. Losowanie planszy Metoda generowania planszy polegająca na wylosowaniu pól a następnie sprawdzeniu poprawności planszy. Metoda ta musi przyjąć przynajmniej jeden argument liczbę wypełnionych pól. Zdajemy sobie sprawę, że czas działania pojedynczej iteracji algorytmu będzie krótki, ale bardzo rzadko wygenerowany wynik będzie poprawny. Zatem czas działania generowania poprawnego sudoku tym algorytmem będzie naprawdę duży, co więcej, będzie on bardzo losowy. Duża liczba zapełnionych pól będzie zmniejszała szansę na poprawność wylosowanej planszy. Mała liczba wypełnionych pól będzie zmniejszała szansę na tylko jedno poprawne rozwiązanie. Ogromną wadą pozostałych algorytmów jest fakt, że nie mogą funkcjonować samodzielnie bez wcześniejszego uruchomienia losowania planszy. 5.2. Permutowanie kolumn i wierszy Metoda permutowania kolumn i wierszy polega na odpowiednim przestawianiu planszy sudoku, tak by wygenerować jej inny wariant. W żaden sposób nie wpływa ona na stopień skomplikowania planszy, pomaga jednak tak ją przekształcić by stworzyć nową. Jeśli będzie takie plansze porównywać człowiek bardzo możliwe iż uzna je za całkiem inny przypadek. Metoda ta potrzebuje jako argumentu wejściowego już gotową poprawną planszę sudoku. Permutowanie kolumn i wierszy może się odbyć w kilku wariantach: - permutowanie kolumn 3x9 w obrębie kwadratu 9x9 (Rys 5.2.1.) - permutowanie wierszy 9x3 w obrębie kwadratu 9x9 (Rys 5.2.2.) - permutowanie kolumn 1x9 w obrębie kolumn 3x9 (Rys 5.2.3.) - permutowanie wierszy 9x1 w obrębie wierszy 9x3 (Rys 5.2.4.) c Rys 5.2.1. Permutowanie kolumn 3x9 w obrębie kwadratu 9x9. 9

Rys 5.2.2. Permutowanie wierszy 9x3 w obrębie kwadratu 9x9. Rys 5.2.3. 9x3Permutowanie kolumn 1x9 w obrębie kolumn 3x9. Rys 5.2.4. Permutowanie wierszy 9x1 w obrębie wierszy 9x3. Dodatkowo można zamienić cyfry ze sobą (Rys 5.2.5.) co da dodatkowe możliwości kolejnych różnych plansz. Również w żaden sposób nie zmieni to stopnia skomplikowania planszy. Wiadomo to zarówno z definicji samej permutacji jak i przez sprawdzenie zaimplementowanymi przez 10

nas metrykami. Z definicji zasad sudoku wynika, że po odpowiednim permutowaniu kolumn i wierszy plansza zawsze będzie poprawna i wciąż będzie posiadać tyle samo rozwiązań. Rys 5.2.5. Permutowanie cyfr. Po tych działaniach otrzymaliśmy dla człowieka kompletnie inną planszę sudoku. Jest to jednak ten sam układ, o tym samym poziomie trudności, który przez nasze algorytmy zostanie rozwiązany w zbliżonym czasie. Śmiało można więc stwierdzić, iż metoda ta świetnie nada się do generowania dużej liczby plansz. 11

5.3 Usuwanie pól Algorytm usuwania pól jest algorytmem, który pozwala zmienić stopień skomplikowania planszy sudoku. Do rozpoczęcia działania algorytm potrzebuje gotowej rozwiązanej (przynajmniej w jakimś stopniu) planszy sudoku. Najlepiej na wejście podać mu w pełni rozwiązaną planszę, wtedy będzie miał najwięcej możliwości generowania nowych. W praktyce w naszym projekcie przed uruchomieniem tego algorytmu trzeba wygenerować planszę losując ją, następnie ją uzupełnić i przekazać jako argument. Dopiero wtedy można uruchomić algorytm usuwający pola. Wygenerowany wynik będzie się różnił od wylosowanej planszy. Dodatkowo należy wspomnieć, że po usunięciu jakiegoś pola cie wiemy czy plansza jest poprawna. Po każdej iteracji należy sprawdzić czy jest rozwiązywalna oraz czy istnieje tylko jedno rozwiązanie. Rys 5.3.1. Usuwanie pól. Algorytm uruchomiony na uzupełnionej planszy: 1. Sprawdź czy liczba wypełnionych pól jest większa od oczekiwanej a. Jeśli liczba wypełnionych pól jest większa: Idź do punktu 2 b. Jeśli liczba oczekiwanych pól jest mniejsza lub równa: Idź do punktu 5 2. Wylosuj pole 3. Usuń wylosowane pole 4. Sprawdź czy istnieje dokładnie jedno rozwiązanie a. Jeśli istnieje wiele rozwiązań: Przywróć usunięte pole i wróć do punktu 1 b. Jeśli istnieje dokładnie 1 rozwiązanie: wróć do punktu 1 5. Zakończ Po wykonaniu się algorytmu można sprawdzić jak trudna plansza została wygenerowana, jeśli nie odpowiada wymaganiom, można wygenerować kolejną, nawet na podstawie tego samego wejścia. 12

5.4 Usuwanie konkretnych pól Jest to zaproponowany przez nas algorytm będący modyfikacją algorytmu usuwającego losowe pola. Różnica jest taka, że chcemy sami decydować jakie pola usuwać. Dokładne kryterium czy dane pole należy usunąć ustalamy na podstawie zaproponowanych przez nas metryk trudności oraz własnych przemyśleń, które powstały podczas analizy trudniejszych sudoku. Po przeanalizowaniu kilku trudniejszych naszym zdaniem plansz sudoku uznaliśmy, iż najlepiej doprowadzić do sytuacji gdy: - będzie najmniej pojedynczych kandydatów na dale pole (funkcja kandydatów) - niektóre cyfry wystąpią bardzo rzadko Na podstawie tych dwóch kryteriów wybierane są pola do usunięcia. Dodatkowo wprowadziliśmy pewną losowość by algorytm nie dawał zawsze takich samych wyników. 13

6. Metryki trudności planszy Określenie poziomu trudności nie jest trywialnym zadaniem. To czy plansza wydaje się być skomplikowana zależy miedzy innymi od wybranej metody rozwiązywania. Algorytmy bazujące na Brute Force lub metodach genetycznych właściwie nie są wrażliwe na poziom trudności planszy. Trudność planszy zależy miedzy innymi od liczby wypełnionych pól. Im jest ich mniej tym plansza jest trudniejsza. Jednak warunkiem poprawności planszy jest tylko jedno rozwiązanie. W przypadku plansz o mniejszej liczbie wypełnionych pól niż 17 zawsze istnieje wiele rozwiązań, co zostało udowodnione matematycznie. Obowiązuje jednak zasada Im więcej pustych pól tym trudniejsza plansza. Dla algorytmów próbujących wypełnić puste pola w kolumnie, wierszu lub kwadracie prostszymi planszami są te, które posiadają najmniej pustych pól, sprawia to że będą one bardzo łatwe do uzupełnienia. Następstwem uzupełnienia tych miejsc w prosty sposób będzie zmniejszenie poziomu całej planszy. Zasada ta powinna implikować fakt, że im więcej pustych pól w kolumnie, wierszu lub kwadracie tym trudniej jest uzupełnić kolejne pola. Nie jesteśmy jednak pewni, czy to założenie jest poprawne. Metryka ta jednak nie jest zaimplementowana w naszym projekcie mimo, że była bardzo prosta. Powodem jest fakt, iż implikuje ona kolejną metrykę związaną z funkcją kandydatów. Wiele algorytmów rozwiązywania sudoku korzysta z tak zwanej funkcji kandydatów. Polega ona na przypisaniu pustym polom planszy listy cyfr, które mogą być tam wstawione. Cyfry te są wybierane na podstawie metod dopełniania oraz eliminacji. Jeśli na dane pole jest tylko jeden kandydat zostaje on automatycznie wpisany. Algorytmy takie jak algorytm Crook a korzystają na samym początku z takiej funkcji dla uproszczenia planszy. Uznaliśmy, że warto zaimplementować funkcję kandydatów w celu sprawdzenia trudności planszy. Jest to najbardziej podobna do ludzkich metod analiza. Nasza metryka wywołuje taką funkcję a następnie sprawdza ile pól zostało w ten sposób wypełnione. Z pewnością można stwierdzić, że plansza jest trudniejsza jeśli jakaś cyfra wcale nie występuje lub występuje bardzo rzadko. Takich przypadków nie ma jednak wyjątkowo dużo, ponieważ plansza musi spełniać warunek posiadania dokładnie jednego rozwiązania. Dodatkowo taki warunek dość ciężko jest określić w sposób skalarny. Z tą metryką mieliśmy sporo trudności, jednak końcowo postanowiliśmy zapisać ją w prosty sposób. Uznaliśmy, że bardzo mała liczba wystąpień danej cyfry zwiększa poziom trudności. Jednak średnia liczba wystąpień nie zwiększa tego poziomu. Dlatego też ustaliliśmy granicę do dwóch wystąpień. Na sza miara zlicza więc cyfry które występują dwa lub mniej razy. Im takich cyfr jest więcej tym sudoku jest trudniejsze. 14

7. Algorytmy rozwiązywania plansz Do celu pomiarów generowanych przez nas plansz sudoku oraz do sprawdzania ich poprawności zaimplementowaliśmy 2 algorytmy rozwiązujące plansze sudoku. Jeden z tych algorytmów posłużył do sprawdzenia ile iteracji zajmie rozwiązanie planszy charakteryzującej się danymi pomiarami według naszych metryk. Sposób działania algorytmu jest zbliżony do rozwiązywania problemu przez człowieka. Drugi zaś algorytm posłużył głównie do sprawdzenia czy dana plansza jest rozwiązywalna oraz czy ma tylko jedno rozwiązanie, algorytm ten bazuje na przeglądzie zupełnym oraz backtrackingu. 7.1 Rule Based Solver Algorytm oparty na zasadach sudoku. Rozwiązuje plansze w taki sposób w jaki zrobiłby to człowiek. Fakt ten implikuje kilka konsekwencji: - Jest wrażliwy na stopień skomplikowania planszy - Działa znacznie szybciej niż Backtracking Solver - Nie wszystkie plansze mogą być rozwiązane z jego pomocą (tak jak nie wszystkie plansze rozwiąże człowiek bazują na standardowych sposobach) Główną częścią tego rozwiązania jest funkcja więzów użyta do znajdywania kandydatów. Funkcja ta wypełnia puste pola wpisując tam wszystkie możliwości, a następnie decyduje którą cyfrę wpisać. Możliwości wybierane są na podstawie podstawowych zasad sudoku. Po określeniu kandydatów automatycznie wstawiani są kandydaci pojedynczy. Następnie wstawiani są kandydaci ukryci. Rys 7.1.1. Wstawianie ukrytych kandydatów. Po pierwszym wykonaniu takiej funkcji sprawdzane jest czy sudoku zostało rozwiązane. Jeśli nie, czynność jest powtarzana. Ponieważ za pomocą tego algorytmu nie da się rozwiązać każdej planszy po określonej liczbie prób algorytm jest przerywany. Algorytm wykonuje się bardzo szybko, więc nawet 1000 prób zajmuje około 1 milisekundę. 15

7.2 Bactracking Solver Algorytm oparty na backtrackingu oraz przeglądzie zupełnym. Potrafi rozwiązać każdą planszę sudoku. Przy jego pomocy można sprawdzić ile rozwiązań ma dana plansza (czy jest poprawna). Jednak działanie tego algorytmu zawsze jest stosunkowo długie. Algorytm polega na sprawdzeniu wszystkich możliwych kombinacji uzupełnienia pól. Przed uzupełnieniem pola zapamiętywany jest poprzedni stan do którego algorytm wraca. Algorytm przywraca stan gdy nie będzie mógł poprawnie wypełnić kolejnego pola lub gdy poprawnie rozwiąże całe sudoku. W przypadku rozwiązania całego sudoku powrót do poprzedniego stanu jest potrzebny aby określić ilość możliwych rozwiązań. 16

8. Plan eksperymentu W celu prezentacji algorytmów a także przeprowadzenia eksperymentu napisaliśmy program konsolowy w języku C++. Program ten ma 3 opcje w menu: - Prezentacja pojedynczego wykonania kolejnych algorytmów wraz z wynikami pomiarów - Wykonanie 100 wywołań kolejnych algorytmów - Próba wygenerowania odpowiednio trudnej planszy sudoku Pojedyncze wykonanie algorytmów pozwoli zweryfikować ich poprawność, przedstawi wygenerowane plansze, a także zaprezentuje pierwsze wyniki dotyczące pomiarów. Część z tych wyników nie będzie znacząco różnić się w przypadku 100 wywołań tych samych funkcji. Wykonanie 100 wywołań algorytmów pomoże nam ustalić średnie czasy wykonywania oraz ilości iteracji. Dzięki temu określimy również odchylenie standardowe, które powie nam jak różnią się wzajemnie pojedyncze pomiary. Przy analizie wyników należy uwzględnić, że np. w przypadku przeglądu zupełnego odchylenie standardowe nie ma znaczenia, jest uwarunkowane losowością, a nie trudnością planszy. Ostatni punkt czyli próba wygenerowania odpowiednio trudnego sudoku pozwoli nam zmierzyć wydajność naszego algorytmu. Będziemy mieli również możliwość sprawdzić czy wygenerowana plansza rzeczywiście jest trudniejsza. 17

9. Wyniki eksperymentu Wyniki w trakcie przygotowania. Dla 1 wywołania: 70000 60000 50000 40000 30000 20000 Kroki BackTracking Kroki RuleBased 10000 0 Losowanie Usuwanie pól Permutacje 0,045 0,04 0,035 0,03 0,025 0,02 0,015 0,01 0,005 0 Losowanie Usuwanie pól Permutacje Czas Backtracking Czas RuleBased 18

14000000 12000000 10000000 80000000 60000000 40000000 iteracje losowanie iteracje usuwanie pól 20000000 0-2000000 0 10 20 30 40 50 70 60 50 40 30 20 czas losowanie czas usuwanie pól 10 0-10 0 10 20 30 40 50 19

10. Gra sudoku W projekcie uwzględniliśmy prócz wykonania pomiarów stworzenie interfejsu użytkownika do gry opartej na naszych algorytmach. Gra wykorzystuje generowanie plansz o określonym poziomie trudności, sprawdza czy plansza jest poprawna oraz pozwala automatycznie ją rozwiązać. Program został napisany w środowisku Unity 3d w języku C#. Interfejs graficzny użytkownika widoczny jest na Rys 10.1. Rys 10.1. Gra sudoku oparta o nasze algorytmy. 20

11. Podsumowanie - Podczas generowania plansz sudoku należy pamiętać, że plansza może posiadać tylko jedno rozwiązanie oraz oczywiście musi być rozwiązywalna. - Do sprawdzenia warunków poprawności planszy sudoku potrzebny jest przegląd zupełny. - Przegląd zupełny rozwiązuje plansze sudoku w dość długim czasie. - Algorytmy rozwiązujące plansze w oparciu o zasady sudoku są bardzo szybkie, jednak nie są w stanie rozwiązać każdej planszy. - Algorytm permutujący kolumny i wiersze nie zmienia poziomu trudności planszy, nadaje się dobrze do generowania bazy plansz do gry. - Przedstawione przez nas algorytmy generowania plansz sudoku potrzebują już gotowej planszy, którą mogłyby zmodyfikować. Stworzenie gotowej planszy zajmuje nieporównywalnie więcej czasu niż jej zmiana. 21

10. Bibliografia - http://hodoku.sourceforge.net/en/techniques.php - A study of Sudoku solving algorithms Patrik Berggren, David Nilsson - http://unity3d.com/ - http://pl.wikipedia.org/wiki/sudoku 22