Docstoc

KGB_Sudoku_dokumentacio

Document Sample
KGB_Sudoku_dokumentacio Powered By Docstoc
					                                               KGB
                Programozz környezettudatosan!

Telepítési útmutató
A jól ismert varázsló segítségével telepíthető az alkalmazás, mely a szokásos kérdéseket teszi fel
telepítés közben:
     Telepítési hely
     Hova helyezze a telepítő a program parancsikonját a Start menün belül?
     Hozzon-e létre parancsikont a telepítő az asztalon?

Ezek beállítása után a telepítő felmásolja a szükséges fájlokat. Mivel a program futtatásához szükség
van Java Runtime Environment-re, ezért a KGB sudoku telepítője tartalmazza a JRE online telepítőjét
is.




A telepítés végén a JRE telepítője is elindul, mely letölti és telepíti a szükséges fájlokat. Amennyiben a
JRE már fel van telepítve a számítógépre, akkor a „Cancel” gomb megnyomásával kihagyható ez a
rész.




Végül egy ablak jelenik meg, melyen beállítható, hogy a telepítő befejezésével a KGB sudoku megoldó
program induljon el.
Használati utasítás
A program használata roppant egyszerű, a KGB sudoku.exe futtatásával indítható el az alkalmazás,
ekkor a következő ablak jelenik meg. Itt egyből be is állíthatjuk a generátor és a szerver IP címét és
portját.




A Start gomb megnyomásával inicializálja a program a hálózati kapcsolatokat, és beállít egy
gazdaságos energiasémát. Megfelelően megadott beállítások esetén ez maximum 4-5 másodpercet
vesz igénybe, rossz beállítások esetén viszont 20-30 másodpercig is próbálkozik, míg hibaüzenetet
kapunk. A beállítások inicializálása után válik csak aktívvá a Stop gomb, ekkor áll készen az alkalmazás
a táblák fogadására.




A Stop gomb megnyomásával állítható le az alkalmazás, ekkor már nem fogad és nem küld több
táblát/kockát, viszont nem záródik be az ablak. Ezt a megszokott módon lehet bezárni (ablak jobb
felső sarkában található X gombbal).

Fontos megjegyzés: az alkalmazás bezárása előtt célszerű a Stop gombra kattintani, mert csak ezután
kerül visszaállításra a számítógép eredeti energiasémája.




Megoldó metódusok:
A hálózaton kapott sudoku táblákat egy kétdimenziós tömbben tároljuk. Minden sudoku táblához
(kétdimenziós tömbhöz) tartozik egy másik kétdimenziós tömb, melyet segédmátrixnak
(helperMatrix-nak) neveztünk el. A megoldás során használt segédmátrix, az egyes üres mezők
lehetséges megoldásait tartalmazza. Tehát a sudoku tábla aktuális állapotában, ezek a megoldások
helyesek lennének (a táblára nézve, a kockára nem).

A segédmátrix mérete egy sudoku tábla méretével egyezik meg, azaz egy 9x9-es mátrix. A
segédmátrix alapértelmezés szerinte 1 és 9 között tartalmazzák a számokat. Az analysis () függvény
inicializálja a helperMatrix-ot, és leszűkíti a mező lehetséges megoldásait a sudokuban található már
megtalált megoldások alapján.

analysis(): Végigmegy a kockán, és a megadott 6 kiértékelési szabály alapján eltávolítja a
helperMatrix(ok)-ból azokat a számokat, melyek a szabályok szerinte nem kerülhetnek már az ahhoz
a cellához tartozó sudoku mezőbe. Ha az algoritmus „talál” olyan cellát a segédmátrixban, amely csak
egy számot tartalmaz, akkor azt beírja a tábla megfelelő mezőjébe, és újból futtatja az analysis()-t,
mivel ez a változás sok cella állapotát befolyásolja.

methodGuessing(): Végigmegy a 3D segédmátrixon. Ha pontosan 2 elemet talál egy cellában, akkor
az egyiket törli, és futtat egy analysis()-t erre a cellára, mivel itt végleges érték keletkezett. Ezután a
függvény rekurzívan meghívja önmagát. Ezt elvégzi 3 elemű cellákra is, ha 2 eleműt már nem talál, és
így tovább 8 elemű cellákig.

zeroElimination4D(): Végigmegy a kocka celláin. Ha 0 értéket, azaz feltöltetlen cellát talál, akkor az
ehhez tartozó oszlopon/soron/mélységen és a hozzá tartozó 3 blokkon végigmegy, és megszámolja,
hogy az egyes értékekből hány darab fordul elő. Ezeket eltárolja egy tömbben. Végül megnézi, hogy
melyik az az érték, mely a legkevesebbszer fordult elő, azaz a legkisebb ütközést okozza, és ezt beírja
az aktuális cellába.

Kockán belüli ütközések kiküszöbölése: (addTable()) Ahogy a metódus a generátortól folyamatosan
fogadja a küldött sudoku táblákat, legenerálja azok minden lehetséges transzformált változatát is, a
(Forgat=0, Tükröz=1) esettől kezdve egészen a (Forgat=3, Tükröz=1) esetig bezárólag. Amikor már
újra beérkezett kilenc tábla, akkor ezen kombinációt eltárolja a Config osztály egy példányaként. (A
Config osztály tartalmazza egy kocka kilenc tábláját (azok esetleges transzformációival együtt), a
kockán belüli ütközésszámot, valamint ütközésszám alapján sorbarendezhető).

Ezután az eltárolt transzformált táblákból véletlenszerű eljárással újabb konfigurációkat gyártunk, és
megvizsgáljuk, hogy melyikben a legkevesebb az ütközés, majd a legjobbat küldjük el a
kiértékelőszervernek.


Energiamegtakarítási módszerek
Igyekeztünk úgy megírni a kódot, hogy a ciklusok futóváltozójától független számításokat a cikluson
kívül végezzük el, mivel egy összeadás vagy osztás is sokat számít, főleg ha 3-4 for ciklus van
egymásba ágyazva.

Egy másik energiamegtakarítási módszer, hogy ahol lehetett, a for ciklusoknak egy optimálisabb
változatát használtuk:

Eredeti for ciklus                                    Optimális változat
for (int i = 0; i < N; i++) {                         for (int i = N; --i >= 0; ) {
    // do something                                       // do something
}                                                     }
A második változat azért optimális, mert a nullával történő összehasonlítást költséghatékonyabban
tudja elvégezni a Java virtuális gép.

Ezeken kívül a program a Windows energiagazdálkodási lehetőségeit is átállítja, hogy a képernyőt 1
perc, a merevlemezt pedig 3 perc után kapcsolja ki, és a processzorhasználatot pedig adaptívra állítja,
aminek hatására az operációs rendszer a szükségleteknek megfelelően változtatja a processzor
órajelét.

Program verziói
Összesen négy verziót készítettünk és töltöttünk fel a programból:
     KGB fast
     KGB clever
     KGB clever v2
     KGB brute
Ezek egyre jobb eredménnyel oldják meg a kockákat, viszont a megoldó algoritmusuk is egyre
bonyolultabb, ezáltal a fogyasztásuk is nagyobb.

KGB fast: A megoldó metódusok közül az analysis() és methodGuessing() algoritmusokat használja,
ezen kívül pedig a kockában megmaradt nullák helyére véletlenszerűen egy 1-9 közti számot helyez.

KGB clever: A megoldó metódusok közül az analysis(), methodGuessing() és zeroElimination()
algoritmusokat használja.

KGB clever v2: A megoldó metódusok közül az analysis(), methodGuessing() és zeroElimination()
algoritmusokat használja. Kicsit lassabb, mint a KGB clever, viszont stabilabb a működése.

KGB brute: A megoldó metódusok közül az analysis(), methodGuessing(), zeroElimination() és kockán
belüli ütközések kiküszöbölésének algoritmusát használja.


Felhasznált eszközök:
   Java Runtime Environment Version 6 Update 24: http://www.java.com/en/download/manual.jsp
   Java SE Development Kit 6u24:
    http://www.oracle.com/technetwork/java/javase/downloads/index.html
   Eclipse IDE: http://www.eclipse.org/
   Verziókövetés: SVN szerver a http://projectlocker.com/ -on
   Jar-ból exe konverter: http://launch4j.sourceforge.net/
   Telepítő készítő alkalmazás: Inno Setup: http://www.jrsoftware.org/isinfo.php
   A http://progverseny.itk.ppke.hu/ oldalon található leírások, programok és forráskódok

				
DOCUMENT INFO
Shared By:
Categories:
Tags:
Stats:
views:7
posted:6/23/2011
language:Hungarian
pages:4