135 lines
3.9 KiB
Markdown
135 lines
3.9 KiB
Markdown
# Q-Table 협상 전략 강화학습 데모
|
||
|
||
기업 간 협상 시뮬레이션을 위한 강화학습 에이전트의 Q-Table 기반 전략 학습 데모입니다.
|
||
|
||
## 주요 기능
|
||
|
||
- ✅ Q-Table 기반 협상 전략 시뮬레이션
|
||
- ✅ 보상함수 R(s,a) = W × (A/P) + (1-W) × End 정확한 구현
|
||
- ✅ FQI (Fitted Q-Iteration) + CQL (Conservative Q-Learning) 시뮬레이션
|
||
- ✅ 실시간 경험 데이터 수집 및 축적
|
||
- ✅ Q-Table 학습 과정 시각화
|
||
- ✅ 콜드 스타트 문제부터 학습된 정책까지 전체 여정 관찰
|
||
|
||
## 시스템 구성
|
||
|
||
### 백엔드 (FastAPI)
|
||
- RESTful API 서버
|
||
- Q-Table 학습 엔진
|
||
- 협상 환경 시뮬레이터
|
||
- 경험 데이터 관리
|
||
|
||
### 프론트엔드 (Streamlit)
|
||
- 대화형 웹 인터페이스
|
||
- 실시간 시각화
|
||
- 단계별 학습 과정 관찰
|
||
|
||
## 설치 및 실행
|
||
|
||
### 1. 의존성 설치
|
||
```bash
|
||
# Poetry를 사용한 설치
|
||
poetry install
|
||
|
||
# 또는 pip 사용
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
### 2. 환경 설정
|
||
```bash
|
||
# .env 파일 복사 및 수정
|
||
cp .env.example .env
|
||
```
|
||
|
||
### 3. 백엔드 서버 실행
|
||
```bash
|
||
# Poetry 사용
|
||
poetry run uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
|
||
|
||
# 또는 직접 실행
|
||
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
|
||
```
|
||
|
||
### 4. 프론트엔드 실행
|
||
```bash
|
||
# Poetry 사용
|
||
poetry run streamlit run frontend/app.py --server.port 8501
|
||
|
||
# 또는 직접 실행
|
||
streamlit run frontend/app.py --server.port 8501
|
||
```
|
||
|
||
### 5. 데모 접속
|
||
- 프론트엔드: http://localhost:8501
|
||
- API 문서: http://localhost:8000/docs
|
||
|
||
## 핵심 개념
|
||
|
||
### 상태 공간 (State Space)
|
||
상태는 (현재 카드, 시나리오, 가격 구간)의 조합으로 구성됩니다:
|
||
- **카드**: C1, C2, C3, C4 (협상 전략 카드)
|
||
- **시나리오**: A, B, C, D (협상 상황별 가중치)
|
||
- **가격 구간**: PZ1, PZ2, PZ3 (목표가 대비 제안가 구간)
|
||
|
||
### 보상함수 (Reward Function)
|
||
```
|
||
R(s,a) = W × (A/P) + (1-W) × End
|
||
```
|
||
- **A**: 앵커링 목표가 (구매자 목표 가격)
|
||
- **P**: 상대방 제안가 (판매자 제시 가격)
|
||
- **End**: 협상 종료 여부 (0 또는 1)
|
||
- **W**: 가중치 = (S_n + PZ_n) / 2
|
||
|
||
### 가중치 시스템
|
||
- **시나리오별 가중치**: S_1=A, S_2=D, S_3=C, S_4=B
|
||
- **가격 구간별 가중치**: 목표가와 제안가 차이에 따른 영향도
|
||
|
||
## 학습 알고리즘
|
||
|
||
### 1. Q-Learning
|
||
전통적인 온라인 강화학습 알고리즘으로 실시간 Q-Table 업데이트
|
||
|
||
### 2. FQI (Fitted Q-Iteration)
|
||
배치 기반 오프라인 강화학습으로 수집된 경험 데이터 활용
|
||
|
||
### 3. CQL (Conservative Q-Learning)
|
||
분포 이동 문제를 해결하기 위한 보수적 Q-Learning
|
||
|
||
## 데모 흐름
|
||
|
||
1. **콜드 스타트**: 초기 Q-Table 상태 (모든 값 0)
|
||
2. **데이터 수집**: 무작위 탐험을 통한 경험 데이터 축적
|
||
3. **Q-Learning**: 수집된 데이터로 Q-Table 실시간 업데이트
|
||
4. **FQI+CQL**: 오프라인 배치 학습 시뮬레이션
|
||
5. **학습된 정책**: 최적화된 협상 전략 활용
|
||
|
||
## 기술 스택
|
||
|
||
- **Backend**: FastAPI, Uvicorn
|
||
- **Frontend**: Streamlit
|
||
- **Data**: Pandas, NumPy
|
||
- **Visualization**: Matplotlib, Seaborn, Plotly
|
||
- **Environment**: Poetry, python-dotenv
|
||
- **Testing**: Pytest
|
||
|
||
## 프로젝트 구조
|
||
|
||
```
|
||
qtable_negotiation_demo/
|
||
├── app/ # FastAPI 백엔드
|
||
│ ├── api/ # API 라우터
|
||
│ ├── core/ # 핵심 설정
|
||
│ ├── models/ # 데이터 모델
|
||
│ └── services/ # 비즈니스 로직
|
||
├── frontend/ # Streamlit 프론트엔드
|
||
├── tests/ # 테스트 코드
|
||
├── data/ # 데이터 파일
|
||
├── pyproject.toml # Poetry 설정
|
||
├── .env # 환경 변수
|
||
└── README.md # 이 파일
|
||
```
|
||
|
||
## 라이선스
|
||
|
||
이 프로젝트는 교육 및 데모 목적으로 제작되었습니다.
|