public static StatisticalSummary test(Agent controller, EvaluationOptions options, int seed) { StatisticalSummary ss = new StatisticalSummary(); int kills = 0; int timeLeft = 0; int marioMode = 0; float marioStatus = 0; for (int i = 0; i < numberOfTrials; i++) { options.setLevelLength(200 + (i * 128) + (seed % (i + 1))); options.setLevelType(i % 3); options.setLevelRandSeed(seed + i); controller.reset(); options.setAgent(controller); Evaluator evaluator = new Evaluator(options); EvaluationInfo result = evaluator.evaluate().get(0); ss.add(result.computeDistancePassed()); kills += result.computeKillsTotal(); timeLeft += result.timeLeft; marioMode += result.marioMode; marioStatus += result.marioStatus; } killsSum += kills; marioStatusSum += marioStatus; timeLeftSum += timeLeft; marioModeSum += marioMode; return ss; }
public EvaluationInfo run1(int currentTrial, int totalNumberOfTrials) { running = true; adjustFPS(); EvaluationInfo evaluationInfo = new EvaluationInfo(); VolatileImage image = null; Graphics g = null; Graphics og = null; image = createVolatileImage(320, 240); g = getGraphics(); og = image.getGraphics(); if (!GlobalOptions.VisualizationOn) { String msgClick = "Vizualization is not available"; drawString(og, msgClick, 160 - msgClick.length() * 4, 110, 1); drawString(og, msgClick, 160 - msgClick.length() * 4, 110, 7); } addFocusListener(this); // Remember the starting time long tm = System.currentTimeMillis(); long tick = tm; int marioStatus = Mario.STATUS_RUNNING; // mario = ((LevelScene) levelScene).mario; int totalActionsPerfomed = 0; // TODO: Manage better place for this: levelScene.mario.resetCoins(); while ( /*Thread.currentThread() == animator*/ running) { // Display the next frame of animation. // repaint(); MDPTraining.train(this); levelScene.tick(); if (gameViewer != null && gameViewer.getContinuousUpdatesState()) gameViewer.tick(); float alpha = 0; // og.setColor(Color.RED); if (GlobalOptions.VisualizationOn) { og.fillRect(0, 0, 320, 240); levelScene.render(og, alpha); } if (agent instanceof ServerAgent && !((ServerAgent) agent).isAvailable()) { System.err.println("Agent became unavailable. Simulation Stopped"); running = false; break; } boolean[] action = agent.getAction(this /*DummyEnvironment*/); if (action != null) { for (int i = 0; i < Environment.numberOfButtons; ++i) if (action[i]) { ++totalActionsPerfomed; break; } } else { System.err.println("Null Action received. Skipping simulation..."); stop(); } // Apply action; // levelScene.keys = action; ((LevelScene) levelScene).mario.keys = action; ((LevelScene) levelScene).mario.cheatKeys = cheatAgent.getAction(null); if (GlobalOptions.VisualizationOn) { String msg = "Agent: " + agent.getName(); LevelScene.drawStringDropShadow(og, msg, 0, 7, 5); msg = "Selected Actions: "; LevelScene.drawStringDropShadow(og, msg, 0, 8, 6); msg = ""; if (action != null) { for (int i = 0; i < Environment.numberOfButtons; ++i) msg += (action[i]) ? levelScene.keysStr[i] : " "; } else msg = "NULL"; drawString(og, msg, 6, 78, 1); if (!this.hasFocus() && tick / 4 % 2 == 0) { String msgClick = "CLICK TO PLAY"; // og.setColor(Color.YELLOW); // og.drawString(msgClick, 320 + 1, 20 + 1); drawString(og, msgClick, 160 - msgClick.length() * 4, 110, 1); drawString(og, msgClick, 160 - msgClick.length() * 4, 110, 7); } og.setColor(Color.DARK_GRAY); LevelScene.drawStringDropShadow(og, "FPS: ", 33, 2, 7); LevelScene.drawStringDropShadow( og, ((GlobalOptions.FPS > 99) ? "\\infty" : GlobalOptions.FPS.toString()), 33, 3, 7); msg = totalNumberOfTrials == -2 ? "" : currentTrial + "(" + ((totalNumberOfTrials == -1) ? "\\infty" : totalNumberOfTrials) + ")"; LevelScene.drawStringDropShadow(og, "Trial:", 33, 4, 7); LevelScene.drawStringDropShadow(og, msg, 33, 5, 7); if (width != 320 || height != 240) { g.drawImage(image, 0, 0, 640 * 2, 480 * 2, null); } else { g.drawImage(image, 0, 0, null); } } else { // Win or Die without renderer!! independently. marioStatus = ((LevelScene) levelScene).mario.getStatus(); if (marioStatus != Mario.STATUS_RUNNING) stop(); } // Delay depending on how far we are behind. if (delay > 0) try { tm += delay; Thread.sleep(Math.max(0, tm - System.currentTimeMillis())); } catch (InterruptedException e) { break; } // Advance the frame frame++; } // ========= evaluationInfo.agentType = agent.getClass().getSimpleName(); evaluationInfo.agentName = agent.getName(); evaluationInfo.marioStatus = levelScene.mario.getStatus(); evaluationInfo.livesLeft = levelScene.mario.lives; evaluationInfo.lengthOfLevelPassedPhys = levelScene.mario.x; evaluationInfo.lengthOfLevelPassedCells = levelScene.mario.mapX; evaluationInfo.totalLengthOfLevelCells = levelScene.level.getWidthCells(); evaluationInfo.totalLengthOfLevelPhys = levelScene.level.getWidthPhys(); evaluationInfo.timeSpentOnLevel = levelScene.getStartTime(); evaluationInfo.timeLeft = levelScene.getTimeLeft(); evaluationInfo.totalTimeGiven = levelScene.getTotalTime(); evaluationInfo.numberOfGainedCoins = levelScene.mario.coins; // evaluationInfo.totalNumberOfCoins = -1 ; // TODO: total Number of coins. evaluationInfo.totalActionsPerfomed = totalActionsPerfomed; // Counted during the play/simulation process evaluationInfo.totalFramesPerfomed = frame; evaluationInfo.marioMode = levelScene.mario.getMode(); evaluationInfo.killsTotal = levelScene.mario.world.killedCreaturesTotal; // evaluationInfo.Memo = "Number of attempt: " + Mario.numberOfAttempts; if (agent instanceof ServerAgent && levelScene.mario.keys != null /*this will happen if client quits unexpectedly in case of Server mode*/) ((ServerAgent) agent).integrateEvaluationInfo(evaluationInfo); return evaluationInfo; }