본문 바로가기
인공지능

[인공지능] Q-learning으로 로봇의 경로찾기

by LSB98 2024. 5. 28.
728x90
반응형

안녕하세요! 오늘은 Q-learning 알고리즘으로 로봇의 경로찾기 실습을 해보고자 합니다.

 

우선적으로, 먼저 해당 강화학습을 실행 할 수 있는 pyton 오픈 소스를 활용해보았습니다.

 

출처 : https://github.com/sichkar-valentyn/Reinforcement_Learning_in_Python#final-q-table-with-values-from-the-final-shortest-route-for-environment-1

 

GitHub - sichkar-valentyn/Reinforcement_Learning_in_Python: Implementing Reinforcement Learning, namely Q-learning and Sarsa alg

Implementing Reinforcement Learning, namely Q-learning and Sarsa algorithms, for global path planning of mobile robot in unknown environment with obstacles. Comparison analysis of Q-learning and Sa...

github.com

 

우선적으로, 해당 파일을 다운로드를 받으면 총 크게 3가지의 py 파일을 볼수가 있는데요.

그 중에서 "run_agent.py" 파일을 실행 하면 자동적으로 다른 py 파일도 실행 될수 있도록 코드가 만들어 졌습니다.

오늘은 해당 실습을 진행하면서 발생했던 문제에 대해서 정보를 전달하고 어떻게 수정했는지에 대해 먼저 말씀드리겠습니다.

 

1. 파일 경로 지정 miss

코드 실행시에 가장 먼저 파일을 찾을 수 없다는 에러 메시지를 보실 수 있습니다.

이는 오픈 소스로 제공 되어진 코드의 파일 경로를 여러분들의 저장 경로에 맞게 수정을 해주시면 에러가 해결이 됩니다.

 

에러 메세지
수정해야 하는 부분

 

 

2. AttributeError: 'DataFrame' object has no attribute 'append' 알람 발생

해당 경로를 수정하고서 다시 컴파일을 하였을 때는 "RL Q-learning sickar Valentyn" 창이 실행이 되면서 아무런 동작을 하지 않았습니다.

 

그리고 터미널 창에서는 AttributeError: 'DataFrame' object has no attribute 'append'  알람이 발생하였는데요.

해당 알람이 발생하는 이유는 pandas 버전 2.0.0 이후로 DataFrame.append() 메서드가 제거되어 따라서 더 이상 사용할 수 없습니다.

 

그래서 저는 코드를 아래와 같이 수정을 하였습니다. => agent_brain.py

 

수정 전 :

# Adding to the Q-table new states
def check_state_exist(self, state):
    if state not in self.q_table.index:
        self.q_table = self.q_table.append(
            pd.Series(
                [0]*len(self.actions),
                index=self.q_table.columns,
                name=state,
            )
        )

 

수정 후 :

# Adding to the Q-table new states
def check_state_exist(self, state):
    if state not in self.q_table.index:
        new_row = pd.Series(
            [0]*len(self.actions),
            index=self.q_table.columns,
            name=state,
        )
        self.q_table = pd.concat([self.q_table, new_row.to_frame().T])

 

 

수정 된 부분을 간략히 설명드리자면, 아래와 같습니다.

concat 사용: append 대신 pd.concat을 사용하여 새로운 행을 데이터프레임에 추가할 수 있습니다.

concat은 리스트로 데이터를 받아 결합하므로, new_row.to_frame().T를 사용하여 pd.Series 객체를 행 형태로 변환한 후 q_table과 결합합니다.

 

이후 정상적으로 코드가 실행이 되어 다음과 같은 결과를 얻을 수가 있었습니다.

 

- 최적의 경로

 

- 단계별 step수와 cost 비용

 

 

- 가장 짧은 루트와 가장 긴 루트 비교

 

  • The shortest route: 16: 최단 경로가 16 스텝임을 나타냅니다.
  • The longest route: 180: 최장 경로가 180 스텝임을 나타냅니다.
  • 경로 리스트: 에이전트가 이동한 경로의 좌표를 나타냅니다.

 

 

- 최종 Q-Table

 

  • Length of final Q-table = 15: 최종 경로에 포함된 상태의 수가 15임을 나타냅니다.
  • Final Q-table with values from the final route: 최종 경로에 대한 Q-테이블의 값들입니다. 각 상태에 대한 Q-값이 네 가지 행동(0, 1, 2, 3)에 대해 나열되어 있습니다.

 

 

- 전체 Q-Table

 

  • Length of full Q-table = 60: 전체 Q-테이블의 상태 수가 60임을 나타냅니다.
  • Full Q-table: 전체 Q-테이블의 값들입니다. 각 상태에 대한 Q-값이 네 가지 행동(0, 1, 2, 3)에 대해 나열되어 있습니다.

 

 

 

이렇게 실습을 마무리 하였습니다.

나머지 파일에 코드도 이와 같이 실행이 가능하며, Reward 값에 따라 해당 Q-Table이 변경되는 점이 인상깊었습니다.

 

감사합니다.

728x90
반응형