Monte Carlo Method 몬테카를로 학습 구현

#Monte Carlo Method 몬테카를로 학습 구현
#SAINT Lab. Q1 [강화학습]
#60201969 이유현 [2024.01.23]
import random #랜덤 에이전트 구현 목적 라이브러리

#환경
class GridWorld():
    def __init__(self):
        self.x=0
        self.y=0
        
    #제일 중요한 함수
    #에이전트로부터 액션을 받아서 상태 변이를 일으키고, 보상을 정해줌
    def step(self, a):
        if a==0:
            self.move_right()
        elif a==1:
            self.move_left()
        elif a==2:
            self.move_up()
        elif a==3:
            self.move_down()
        
        reward = -1
        done = self.is_done()
        return (self.x, self.y), reward, done
    
    def move_right(self):
        self.y += 1
        if self.y > 3:
            self.y = 3
    
    def move_left(self):
        self.y -= 1
        if self.y < 0:
            self.y = 0
    
    def move_up(self):
        self.x -= 1
        if self.x < 0:
            self.x = 0
    
    def move_down(self):
        self.x += 1
        if self.x > 3:
            self.x = 3
       
    #에피소드가 끝났는지 판별해주는 함수     
    def is_done(self):
        if self.x == 3 and self.y == 3: #종료상태 도달
            return True
        else:
            return False
        
    def get_state(self):
        return (self.x, self.y)
    
    #종료 상태 도달 시 처음으로 리셋
    def reset(self):
        self.x = 0
        self.y = 0
        return (self.x, self.y)

#에이전트    
class Agent():
    def __init__(self):
        pass
    
    #랜덤 액션 선택
    def select_action(self):
        coin = random.random()
        if coin < 0.25:
            action = 0
        elif coin < 0.5:
            action = 1
        elif coin < 0.75:
            action = 2
        else:
            action = 3
        return action

#본격적으로 학습을 하는 메인 함수
def main():
    env = GridWorld() #환경 클래스의 인스턴스
    agent = Agent()
    data = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] #테이블 초기화
    gamma = 1.0 #감쇠 인자
    alpha = 0.0001 #업데이트할 때 사용하는 파라미터
    
    for k in range(50000): #총 5만 번의 에피소드 진행
        done = False
        history = []
        while not done: #랜덤 에이전트가 경험을 쌓는 과정
            action = agent.select_action()
            (x,y), reward, done = env.step(action)
            history.append((x,y,reward))
        env.reset()
        
        #매 애피소드가 끝나고 바로 해당 데이터를 이용해 테이블을 업데이트
        cum_reward = 0
        for transition in history[::-1]: #방문했던 상태들을 뒤에서부터 보며 차례차례 리턴을 계산 / 업데이트
            x, y, reward = transition
            data[x][y] = data[x][y] + alpha * (cum_reward - data[x][y])
            cum_reward = reward + gamma * cum_reward
            
    #학습이 끝나고 난 후 데이터를 출력해보기 위한 코드
    for row in data:
        print(row)
        
main()
PS C:\\Users\\yuhyu\\Desktop\\CODE>  & 'C:\\Users\\yuhyu\\AppData\\Local\\Programs\\Python\\Python311\\python.exe' 'c:\\Users\\yuhyu\\.vscode\\extensions\\ms-python.python-2023.22.1\\pythonFiles\\lib\\python\\debugpy\\adapter/../..\\debugpy\\launcher' '55366' '--' 'C:\\Users\\yuhyu\\Desktop\\CODE\\Monte_Carlo_Method.py'
[-58.10720180108525, -56.12318226310994, -52.0520116993405, -50.27044865210934]
[-56.418550032727, -53.406277400359116, -48.33834916636482, -44.300056140512275]
[-53.8443301974015, -49.32410092480804, -41.06965096350658, -29.4641804456401]  
[-51.48295145534912, -45.49482559809898, -30.66538245627557, 0.0]

Temporal Difference 시간적 차이 학습 구현

#Temporal Difference 시간적 차이 학습 구현
#SAINT Lab. Q1 [강화학습]
#60201969 이유현 [2024.01.23]
import random #랜덤 에이전트 구현 목적 라이브러리

#환경
class GridWorld():
    def __init__(self):
        self.x=0
        self.y=0
        
    #제일 중요한 함수
    #에이전트로부터 액션을 받아서 상태 변이를 일으키고, 보상을 정해줌
    def step(self, a):
        if a==0:
            self.move_right()
        elif a==1:
            self.move_left()
        elif a==2:
            self.move_up()
        elif a==3:
            self.move_down()
        
        reward = -1
        done = self.is_done()
        return (self.x, self.y), reward, done
    
    def move_right(self):
        self.y += 1
        if self.y > 3:
            self.y = 3
    
    def move_left(self):
        self.y -= 1
        if self.y < 0:
            self.y = 0
    
    def move_up(self):
        self.x -= 1
        if self.x < 0:
            self.x = 0
    
    def move_down(self):
        self.x += 1
        if self.x > 3:
            self.x = 3
       
    #에피소드가 끝났는지 판별해주는 함수     
    def is_done(self):
        if self.x == 3 and self.y == 3: #종료상태 도달
            return True
        else:
            return False
        
    def get_state(self):
        return (self.x, self.y)
    
    #종료 상태 도달 시 처음으로 리셋
    def reset(self):
        self.x = 0
        self.y = 0
        return (self.x, self.y)

#에이전트    
class Agent():
    def __init__(self):
        pass
    
    #랜덤 액션 선택
    def select_action(self):
        coin = random.random()
        if coin < 0.25:
            action = 0
        elif coin < 0.5:
            action = 1
        elif coin < 0.75:
            action = 2
        else:
            action = 3
        return action

#본격적으로 학습을 하는 메인 함수
def main():
    env = GridWorld() #환경 클래스의 인스턴스
    agent = Agent()
    data = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] #테이블 초기화
    gamma = 1.0 #감쇠 인자
    alpha = 0.01 #MC에 비해 큰 값을 사용: TD가 MC에 비해 학습의 변동성이 작은 덕분에 큰 폭의 업데이트가 가능
    
    for k in range(50000): #총 5만 번의 에피소드 진행
        done = False
        history = []
        while not done: #랜덤 에이전트가 경험을 쌓는 과정
            x, y = env.get_state()
            action = agent.select_action()
            (x_prime, y_prime), reward, done = env.step(action)
            x_prime, y_prime = env.get_state()
            
            #한 번의 step이 진행되자 마자 바로 테이블의 데이터를 업데이트 해줌
            data[x][y] = data[x][y] + alpha * (reward + gamma * data[x_prime][y_prime] - data[x][y])
        env.reset()
            
    #학습이 끝나고 난 후 데이터를 출력해보기 위한 코드
    for row in data:
        print(row)
        
main()
PS C:\\Users\\yuhyu\\Desktop\\CODE> & C:/Users/yuhyu/AppData/Local/Programs/Python/Python311/python.exe c:/Users/yuhyu/Desktop/CODE/Temporal_Difference.py
[-59.600843535150226, -57.61812381534683, -54.225961046262995, -51.85792867871927]
[-57.86248000315834, -55.1537759404265, -50.40931469255334, -45.62909009382938]   
[-54.562002551037054, -49.95594540191525, -41.46912085898049, -31.099402937538297]
[-51.488690434234314, -45.21546182004205, -29.788365212148257, 0]

Monte_Carlo_Method.py

Temporal_Difference.py