RLPark 1.0.0
Reinforcement Learning Framework in Java

DaylongAgent.java

Go to the documentation of this file.
00001 package rlpark.plugin.critterbot.agents;
00002 
00003 import java.awt.Color;
00004 import java.io.IOException;
00005 import java.util.Arrays;
00006 import java.util.Random;
00007 
00008 import rlpark.plugin.critterbot.actions.CritterbotAction;
00009 import rlpark.plugin.critterbot.actions.XYThetaAction;
00010 import rlpark.plugin.critterbot.data.CritterbotObservation;
00011 import rlpark.plugin.critterbot.environment.CritterbotEnvironment;
00012 import rlpark.plugin.critterbot.environment.CritterbotRobot;
00013 import rlpark.plugin.rltoys.agents.Agent;
00014 import rlpark.plugin.rltoys.agents.rl.RandomAgent;
00015 import zephyr.plugin.core.api.internal.monitoring.fileloggers.TimedFileLogger;
00016 import zephyr.plugin.core.api.monitoring.annotations.Monitor;
00017 import zephyr.plugin.core.api.synchronization.Clock;
00018 
00019 @SuppressWarnings("restriction")
00020 public class DaylongAgent {
00021   public static interface DaylongSlaveAgent {
00022     void setInControl(boolean inControl);
00023   }
00024 
00025   private final double chargingVoltage;
00026   @Monitor(emptyLabel = true)
00027   private final CritterbotEnvironment environment;
00028   private final DockingAgent dockingAgent;
00029   private CritterbotObservation critterObs;
00030   private long timeVoltageAbove = -1;
00031   private long timeDocked = -1;
00032   @Monitor
00033   private final Agent agent;
00034   private final TimedFileLogger logFile;
00035   @Monitor
00036   private boolean daylongInControl;
00037 
00038   public DaylongAgent(String filepath, CritterbotEnvironment environment, Agent agent, double chargingVoltage)
00039       throws IOException {
00040     this.environment = environment;
00041     this.chargingVoltage = chargingVoltage;
00042     dockingAgent = new DockingAgent(environment);
00043     this.agent = agent;
00044     logFile = new TimedFileLogger(filepath, false);
00045     logFile.add(this);
00046     System.out.println("Critterbot will charge at " + chargingVoltage);
00047   }
00048 
00049   private void updateCharging() {
00050     double voltageMax = Math.max(critterObs.bat[0], Math.max(critterObs.bat[1], critterObs.bat[2]));
00051     if (timeVoltageAbove < 0 || voltageMax >= chargingVoltage || isDocked())
00052       timeVoltageAbove = critterObs.time;
00053     if (!isDocked())
00054       timeDocked = critterObs.time;
00055   }
00056 
00057   private boolean isDocked() {
00058     return critterObs.busVoltage > 170;
00059   }
00060 
00061   private boolean needsCharging() {
00062     return critterObs.time - timeVoltageAbove > 10000;
00063   }
00064 
00065   private Color pickupColor() {
00066     if (needsCharging())
00067       return Color.BLUE;
00068     if (isDockedAndWait())
00069       return Color.WHITE;
00070     if (isDocked())
00071       return Color.GREEN;
00072     return Color.BLACK;
00073   }
00074 
00075   public void setLeds(Color[] colors) {
00076     if (critterObs == null)
00077       return;
00078     Arrays.fill(colors, pickupColor());
00079     colors[0] = Color.RED;
00080     colors[colors.length / 2] = Color.MAGENTA;
00081   }
00082 
00083   public void run() {
00084     Clock clock = new Clock("Daylong");
00085     while (clock.tick() && !environment.isClosed())
00086       environment.sendAction(getAtp1(environment.waitNewObs()));
00087   }
00088 
00089   public CritterbotAction getAtp1(double[] envObs) {
00090     critterObs = environment.getCritterbotObservation(envObs);
00091     updateCharging();
00092     daylongInControl = needsCharging() || isDockedAndWait();
00093     if (agent instanceof DaylongSlaveAgent)
00094       ((DaylongSlaveAgent) agent).setInControl(!daylongInControl);
00095     CritterbotAction action = getAction(envObs);
00096     logFile.update();
00097     return action;
00098   }
00099 
00100   public CritterbotAction getAction(double[] envObs) {
00101     if (daylongInControl)
00102       return dockingAgent.getAtp1(envObs);
00103     return (CritterbotAction) agent.getAtp1(envObs);
00104   }
00105 
00106   private boolean isDockedAndWait() {
00107     return isDocked() && critterObs.time - timeDocked < 10000;
00108   }
00109 
00110   public static void main(String[] args) throws IOException {
00111     CritterbotEnvironment environment = new CritterbotRobot();
00112     RandomAgent funAgent = new RandomAgent(new Random(0), XYThetaAction.sevenActions());
00113     DaylongAgent daylongAgent = new DaylongAgent("/tmp/daylong.crtrlog", environment, funAgent, 160);
00114     daylongAgent.run();
00115   }
00116 }
 All Classes Namespaces Files Functions Variables Enumerations
Zephyr
RLPark