public static Observation makeObservationFor(POMDPDomain d, GroundedAction a, POMDPState s) { ObjectInstance indexer = s.getObject(Names.OBJ_INDEXER); int index = indexer.getDiscValForAttribute(Names.ATTR_INDEX); if (index == iterations) { return d.getObservation(Names.OBS_COMPLETE); } ObjectInstance leftDoor = s.getObject(Names.OBJ_LEFT_DOOR); ObjectInstance rightDoor = s.getObject(Names.OBJ_RIGHT_DOOR); int leftDoorTiger = leftDoor.getDiscValForAttribute(Names.ATTR_TIGERNESS); java.util.Random random = new java.util.Random(); if (a.action.getName().equals(Names.ACTION_LISTEN)) { Observation left = d.getObservation(Names.OBS_LEFT_DOOR + random.nextInt(observationsPerState)); Observation right = d.getObservation(Names.OBS_RIGHT_DOOR + random.nextInt(observationsPerState)); if (leftDoorTiger == 1) { return random.nextDouble() < 1 - noise ? left : right; } else { return random.nextDouble() < 1 - noise ? right : left; } } else { return d.getObservation(Names.OBS_NULL); } }
@Override public State performActionHelper(State st, String[] params) { POMDPState ps = new POMDPState(st); int index = ps.getObject(Names.OBJ_INDEXER).getDiscValForAttribute(Names.ATTR_INDEX); ps.getObject(Names.OBJ_INDEXER).setValue(Names.ATTR_INDEX, index + 1); boolean doorChoice = new java.util.Random().nextBoolean(); ps.getObject(Names.OBJ_LEFT_DOOR).setValue(Names.ATTR_TIGERNESS, doorChoice ? 0 : 1); ps.getObject(Names.OBJ_RIGHT_DOOR).setValue(Names.ATTR_TIGERNESS, doorChoice ? 1 : 0); return ps; }