ARotting's picture
Publish Offline return-conditioned key-door policy
77a4175 verified
Raw
History Blame Contribute Delete
1.67 kB
from __future__ import annotations
ACTIONS = ["left", "right", "claim"]
class KeyDoorCorridor:
def __init__(self, start: int = 4, max_steps: int = 20) -> None:
self.position = start
self.has_key = start == 1
self.max_steps = max_steps
self.steps = 0
self.done = False
self.terminal = "none"
@property
def state(self) -> tuple[int, int]:
return self.position, int(self.has_key)
def step(self, action: int) -> float:
if self.done:
return 0.0
reward = -0.01
if action == 0:
self.position = max(0, self.position - 1)
elif action == 1:
if not (self.position == 6 and not self.has_key):
self.position = min(8, self.position + 1)
elif action == 2 and self.position == 6:
reward += 0.4
self.done = True
self.terminal = "near_reward"
elif action == 2 and self.position == 8 and self.has_key:
reward += 1.0
self.done = True
self.terminal = "treasure"
if self.position == 1:
self.has_key = True
self.steps += 1
if self.steps >= self.max_steps and not self.done:
self.done = True
self.terminal = "timeout"
return reward
def expert_action(environment: KeyDoorCorridor, goal: str) -> int:
if goal == "treasure":
if not environment.has_key:
return 0
if environment.position < 8:
return 1
return 2
if environment.position < 6:
return 1
if environment.position > 6:
return 0
return 2