Skip to content

[Feat] ENV - environment 섹션 구조 개선 및 config 분리#8

Open
ohchanju3 wants to merge 7 commits into
mainfrom
feat/env
Open

[Feat] ENV - environment 섹션 구조 개선 및 config 분리#8
ohchanju3 wants to merge 7 commits into
mainfrom
feat/env

Conversation

@ohchanju3
Copy link
Copy Markdown
Collaborator

@ohchanju3 ohchanju3 commented May 23, 2026

개요

RL 환경(environment.py, state.py, constraints.py)을 파이프라인 설계에 맞게 수정하고, 하드코딩된 상수를 분리했습니다.


파일별 변경 내용

RL/config.py (new)

역할: 환경 전반에서 쓰이는 상수 한 곳에서 관리

기존에는 END_DUTY, END_PAIRING 같은 action 인덱스나 FAA_DUTY_TABLE이 environment.py 안에 하드코딩되어 있었습니다. 나중에 항공사 확장하거나 커리큘럼 수정할 때 값 찾으러 코드 내부 들어가야 하는 문제가 있어서 분리했습니다.

  • END_DUTY = -2, END_PAIRING = -1: numpy 음수 인덱싱 활용
  • FAA_DUTY_TABLE: legs 수 기준 최대 duty 시간 테이블
  • DEFAULT_CONSTRAINTS: constraint 없을 때 environment 내부 fallback값
  • CURRICULUM_CONFIG: 스테이지별 END_DUTY 허용 여부 스위치
    (Stage 1은 단일 duty만 → END_DUTY 차단)

RL/environment.py (수정)

역할: RL MDP의 전환 로직 — mask → action → next state + reward

  1. step() 통합
    기존에 step_end_duty(), step_end_pairing()이 별도 함수로 있어서 train.py에서 action 종류별로 다른 함수를 호출해야 했습니다. step() 하나로 통합해서 train.py가 항상 step()만 호출하면 됩니다.

    • action 0~N-1: flight 선택 → 공항/시간 갱신, dead_time reward
    • action N (END_DUTY): rest 진입, duty 리셋
    • action N+1 (END_PAIRING): pairing 비용 부과 후 새 pairing 시작.
      미배정 flight 없으면 done=True로 에피소드 종료
  2. duty 시간 계산 방식 변경
    기존은 순수 비행 시간만 누적했는데, FAA Part 117의 duty period는 연결 대기 시간도 포함입니다. duty 시작 시각 ~ 해당 flight 도착 시각 전체 window로 계산하도록 수정했습니다.

  3. get_mask()에 stage 파라미터 추가
    커리큘럼 Stage 1은 단일 duty만 학습해야 하므로 END_DUTY 마스크를 stage별로 자동 제어합니다.

  4. rest 후 max_conn 체크 제거
    max_conn은 같은 duty 내 flight 간 연결 시간 제약인데, rest 이후 새 duty 시작에 잘못 적용되고 있었습니다.

  5. multi-base 관련 코드 추가

    • pairing 첫 편 반드시 base 출발 체크 추가
    • END_PAIRING 시 base 미복귀면 BASE_PENALTY 차감

RL/state.py (수정)

역할: 에피소드 시작 시 초기 state dict 생성 (딱 한 번 호출)

  • constraint["base_airport"] 기반으로 초기 공항/시각 설정. base 출발 편 중 가장 이른 편을 current_time 기준으로 사용
  • 11개 필드 각각 인라인 주석 추가
  • duty_time과 duty_start_time 역할 구분 명시
    • duty_time: decoder state_vec feature용 누적 비행 시간
    • duty_start_time: get_mask()에서 FAA window 체크 기준점으로 사용

RL/constraints.py + RL/airline_constraints/ (수정/new)

역할: 항공사별 운항 제약 정의 + FiLM 입력 키 순서 관리

기존에는 constraint 값이 get_delta_constraints() 함수 안에 딕셔너리로 박혀 있었습니다. 다른 항공사를 추가할 때 함수 열어서 비교/수정해야 해서 airline_constraints/ 디렉토리로 분리했습니다.

  • airline_constraints/delta.py: DELTA_CONSTRAINTS 상수 정의
  • constraints.py: import 후 반환만 담당
  • 새 항공사 추가 시 파일 하나 추가 + constraints.py에 한 줄이면 됩니다.
  • get_delta_constraints(base_airport: int): 에피소드별 base_airport를 주입받아 반환합니다. train.py에서 랜덤 선택 후 주입하는 구조입니다.

related issue #7

@ohchanju3 ohchanju3 requested a review from pkhyrn268 May 23, 2026 12:08
@ohchanju3 ohchanju3 self-assigned this May 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant