Unser Logger zum Debuggen

Moderator: Praktikum: Künstliche Intelligenz

Felix End
Windoof-User
Windoof-User
Beiträge: 24
Registriert: 15. Dez 2013 15:08

Unser Logger zum Debuggen

Beitrag von Felix End » 19. Mai 2015 12:32

Heyo,

wir haben uns mal einen Logger gebaut, der so einen output produziert:
(Anmerkung: Die Formatierung ist hier im Forum schlecht, weil Buchstaben unterschiedlich breit sind und merhfach leertasten gelöscht werden. In einer Textdatei ist das etwas lesbarer ;))


Game Stats:
Tick: 8 bestValues: 1.0000014420163317 Action: ACTION_DOWN remaining Time: 18 ms

Sample Stats:
#Samples: 6.0 maxScore: 1.0 minScore: -1.1798230088495576 avgScore: 0.1366961651917404

Orientation: ACTION_DOWN
Actions visits score UCTvalue
ACTION_USE 1 0.0 0.0
ACTION_LEFT 1 0.0 0.0
ACTION_RIGHT 2 -0.5899115044247788 0.0
ACTION_DOWN 1 1.0 0.0
ACTION_UP 1 1.0 0.0


Evo Stats:
Best weightVector Fitness score: -Infinity
weights:
-0.7036471662417293 1.1374674758356855 0.0535846699073151 -0.18960967717664814 -2.168105431092527

Average weightVector:
weights:
-0.6405746873138107 0.22745451618963247 -0.6785203339191661 0.40694386866686694 -0.48286499973774843


Knowledge Stats
0: score: 0.0, wins: 0, loses: 0, none: 203, lastModStep: 1
3: score: 0.0, wins: 0, loses: 0, none: 52, lastModStep: 365
8: score: 2.0, wins: 0, loses: 0, none: 1, lastModStep: 318
9: score: 14.0, wins: 0, loses: 0, none: 14, lastModStep: 3

Map:
Left is the map of the game before the action was taken and on the right is a map of the sample end points.

E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 _______ E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0
E0 A1 OO OO E3 OO OO B9 OO OO OO OO OO E3 E3 OO OO C4 E0 _______ E0 _4 OO _3 E3 OO OO B9 OO OO OO OO OO E3 E3 OO OO C4 E0
E0 B9 OO OO E3 OO OO OO OO OO OO OO OO E3 E3 OO OO B9 E0 _______ E0 _2 _1 OO E3 OO OO OO OO OO OO OO OO E3 E3 OO OO B9 E0
E0 E0 E0 E0 E0 OO OO OO OO OO OO B9 OO E0 E0 E0 E0 E0 E0 _______ E0 E0 E0 E0 E0 OO OO OO OO OO OO B9 OO E0 E0 E0 E0 E0 E0
E0 OO OO OO OO OO E0 OO OO OO OO OO OO OO OO E0 OO B9 E0 _______ E0 OO OO OO OO OO E0 OO OO OO OO OO OO OO OO E0 OO B9 E0
E0 OO B9 OO OO OO E0 E0 E0 E0 E0 E0 E0 OO OO OO OO E0 E0 _______ E0 OO B9 OO OO OO E0 E0 E0 E0 E0 E0 E0 OO OO OO OO E0 E0
E0 OO OO B9 OO OO OO OO OO OO B9 OO OO B9 OO B9 OO OO E0 _______ E0 OO OO B9 OO OO OO OO OO OO B9 OO OO B9 OO B9 OO OO E0
E0 E0 E0 E0 E0 OO OO OO OO OO E0 E0 E0 OO OO OO OO B9 E0 _______ E0 E0 E0 E0 E0 OO OO OO OO OO E0 E0 E0 OO OO OO OO B9 E0
E0 B9 B9 B9 OO OO OO OO OO OO B9 OO OO OO OO B9 OO D6 E0 _______ E0 B9 B9 B9 OO OO OO OO OO OO B9 OO OO OO OO B9 OO D6 E0
E0 B9 B9 B9 E0 OO OO OO B8 OO OO OO OO B9 OO OO E0 E0 E0 _______ E0 B9 B9 B9 E0 OO OO OO B8 OO OO OO OO B9 OO OO E0 E0 E0
E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 _______ E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0



Sample: _4 #samples: 3 maxScore: 0.0 avgScore: 0.0
Sample: _3 #samples: 1 maxScore: -1.1798230088495576 avgScore: -1.1798230088495576
Sample: _2 #samples: 1 maxScore: 1.0 avgScore: 1.0
Sample: _1 #samples: 1 maxScore: 1.0 avgScore: 1.0


Die Karten zeigen die Objekte an. Man sieht idr. schnell welche Zahl-Buchstabe kombination welches Objekt ist, wenn man das Spiel nebenher offen hat. Die linke Karte zeigt die Endpunkte der samples an (mit Unterstrich Zahl "_0" oder mit kleinbuchstabe und zahl) und unter der karte steht wieviele samples an diesem punkt geendet sind, was der maxScore und was der durchschnittsscore sind.

Der Logger war für uns beim Debuggen ganz nützlich und vll. hilft der ja auch euch. Deshalb laden wir den mal einfach hier hoch ^^

Der Logger wird so im Agenten angelegt:

Code: Alles auswählen

    public static final Logger logger = Logger.getLogger( MCTSSearch.class.getName() );
    FileHandler fh;

Die Logs werden automatisch unter "./Logs/LogInternals/LogFile.log" angelegt. Das Verzeichnis LogInternals muss dafür aber noch angelegt werden.
Ist "Config.LOGTOCONSOLE" auf true werden die Logs auch direkt auf der Konsole ausgegeben.

Code: Alles auswählen

    private void setupLogging() {
        try {  
            // This block configure the logger with handler and formatter  
            fh = new FileHandler("./Logs/LogInternals/LogFile.log");  
            logger.addHandler(fh);
            
            // This makes the logged messages not look terrible
            SimpleFormatter formatter = new SimpleFormatter();  
            fh.setFormatter(formatter);  
            
            // log everything
            logger.setLevel(Level.ALL);
            logger.info("\nLogger started");  

            // do not print on console
            logger.setUseParentHandlers(Config.LOGTOCONSOLE);

        } catch (Exception e) { 
            e.printStackTrace();  
        }  
	}


In der Suche (nach dem act(...) methode vom Agent) muss der Logger im neu initialsiert werden:

Code: Alles auswählen

        	LoggingInformation.init(stateObs); 

Ein einzelnes Sample kann so hinzugefügt werden:

Code: Alles auswählen

            	LoggingInformation.addSample(currentState, value, currentNode);
wobei Value der score des Samples ist, currentState der Endstate und currentNode der Knoten bei MCTS.


Am Ende der Suche fügen wir noch allgemeine Statistiken und unsere speziellen Statistiken hinzu mit:

Code: Alles auswählen

        	LoggingInformation.setSimpleStats(currentState, bestValue, availableActions[selected], root);
        	LoggingInformation.setEvoStats( roller.getFeatures().getFeatureVector(), system.bestYet, system.bestScore, system.population, rootState.getAvailableActions());
        	LoggingInformation.setKnowledgeStats(memory);
und schreiben es schließlich alles in eine Datei bzw. auf die Konsole:

Code: Alles auswählen

    private void logInternals() {
    	String gameStats = LoggingInformation.formatGameStats();
    	String sampleStats = LoggingInformation.formatSampleStats();
    	String evoStatistics = LoggingInformation.formatEvoStats();
    	String knowledgeBase = LoggingInformation.formatKnowledgeStats();
    	String bothMaps = LoggingInformation.formatNormalAndSampleMap(); 
    			
		logger.info("\n\n" + gameStats + sampleStats  + evoStatistics  + knowledgeBase + bothMaps + "\n\n"); 
	}


Natürlich ist der Logger nicht schnell, dh. es macht Sinn ihn in "if(LoggingEnabled)" blöcke zu packen sodass man ihn ausschalten kann.
Außerdem KANN MAN DEN LOGGER NICHT MIT HOCHLADEN. DIE GVG-AI Seite gibt einem einen Compile Error wenn man den Logger mit hochläd, dh. man muss die Logger aufrufe vorher entfernen before man seine zip Datei hochläd!
Dateianhänge
TuUtils.java
Hilfsfunktionen
(813 Bytes) 15-mal heruntergeladen
LoggingInformation.java
(10.14 KiB) 17-mal heruntergeladen

Zurück zu „Praktikum: Künstliche Intelligenz“