RLPark 1.0.0
Reinforcement Learning Framework in Java
|
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 }