iksanDrT · wonju · goyangDrT — jsprit 기반 배차 최적화 비교
| 항목 | iksanDrT | wonju | goyangDrT |
|---|---|---|---|
| 배차 실행 방식 | 예약 입력 시 수동 | 매분 자동 (스케줄러) | 수동 + 자동 (이중) |
| 동시 차량 수 | 여러 대 | 여러 대 | 1대 (배차건 당) |
| 차량 유형 | 여러 유형 | 여러 유형 | 단일 유형 |
| 시간대 제약 | 있음 (4가지) | 있음 (4가지) | 없음 |
| 비용 가중치 설정 | 차량 유형별 DB 설정 | 차량 유형별 DB 설정 | 설정 테이블 (거리70:시간30) |
| 알고리즘 반복 횟수 | 기본값 (미지정) | 기본값 (미지정) | 2,000회 (설정 가능) |
| 도로 비용 계산 | pgRouting (기본) | pgRouting (기본) | pgRouting (회전제한 반영) |
| 중간 배차 | jsprit 재실행 | 없음 | 자체 알고리즘 (빠름) |
| 알림 | 없음 | SMS (실패 시) | 앱 푸시 (MQTT) |
| 경로 지도 데이터 | 없음 | 없음 | 있음 (운전자 앱용) |
| 예약 상태 관리 | 스토어드 프로시저 | 스토어드 프로시저 | 확정/취소 직접 업데이트 |
| 코드 구조 | 단일 클래스 (절차적) | 단일 클래스 (절차적) | 역할별 분리 (모듈화) |
jsprit은 "차량 경로 최적화 엔진"입니다. 아래 변수들을 입력하면, 가장 효율적인 배차 경로를 계산해줍니다.
| 설정 항목 | 쉬운 설명 | 익산 | 원주 | 고양 |
|---|---|---|---|---|
| 좌석 수 capacityDimension |
차량에 최대 몇 명까지 탈 수 있는지. 이 숫자를 넘으면 더 태울 수 없음 | 차량별 다름 (DB) | 차량별 다름 (DB) | 차량별 다름 (DB) |
| 거리 비용 가중치 costPerDistance |
이 값이 클수록 "총 이동거리를 줄이는 것"을 우선시함. 예: 0.7이면 거리 절감에 70% 비중 |
차량 유형별 DB 설정 (예: 소형 0.6, 대형 0.7) | 차량 유형별 DB 설정 (예: 소형 0.6, 대형 0.7) | 0.7 (고정) |
| 시간 비용 가중치 costPerTime |
이 값이 클수록 "총 이동시간을 줄이는 것"을 우선시함. 예: 0.3이면 시간 절감에 30% 비중 |
차량 유형별 DB 설정 (예: 소형 0.4, 대형 0.3) | 차량 유형별 DB 설정 (예: 소형 0.4, 대형 0.3) | 0.3 (고정) |
| 설정 항목 | 쉬운 설명 | 익산 | 원주 | 고양 |
|---|---|---|---|---|
| 차량 번호 id |
결과에서 "이 승객은 몇 번 차량에 배정"인지 식별하는 이름 | 차량번호 | 차량번호 | 차량ID |
| 출발 위치 startLocation |
차량이 지금 있는 곳 (차고지). 첫 승객까지의 거리 계산에 사용 | 차고지 위치 | 차고지 위치 | 출발 노드 |
| 차고지 복귀 returnToDepot |
마지막 승객 하차 후 차고지로 돌아가야 하는지 여부 | 항상 복귀 | 항상 복귀 | 설정 가능 |
| 설정 항목 | 쉬운 설명 | 익산 | 원주 | 고양 |
|---|---|---|---|---|
| 예약 번호 id |
각 예약을 구분하는 고유 번호 | 승객 인덱스 | 승객 인덱스 | 예약ID |
| 탑승 인원 sizeDimension |
이 예약으로 타는 사람 수. 승차 시 좌석을 차지하고 하차 시 비워짐 | DB에서 로드 | DB에서 로드 | 예약 인원수 |
| 승차 장소 pickupLocation |
승객을 태우는 정류장. 반드시 하차 전에 방문해야 함 | 승차 노드 | 승차 노드 | 승차 노드 |
| 하차 장소 deliveryLocation |
승객을 내려주는 정류장. 반드시 승차 후에 방문 | 하차 노드 | 하차 노드 | 하차 노드 |
| 정차 시간 serviceTime |
승차/하차 시 차량이 정류장에 머무는 시간 (승객 탑승/하차 소요) | 예약별 다름 | 예약별 다름 | 2분 (고정) |
| 희망 승차 시간대 pickupTimeWindow |
"이 시간~저 시간 사이에 태워주세요" — 이 범위 밖에 도착하면 안 됨 | 있음 | 있음 | 없음 |
| 희망 하차 시간대 deliveryTimeWindow |
"이 시간~저 시간 사이에 도착하고 싶어요" — 도착 보장 시간대 | 있음 | 있음 | 없음 |
| 설정 항목 | 쉬운 설명 | 익산 | 원주 | 고양 |
|---|---|---|---|---|
| 차량 수 제한 fleetSize |
FINITE = 실제 보유 차량만 사용. 차량이 부족하면 일부 승객이 배정되지 않을 수 있음 | FINITE | FINITE | FINITE |
| 비용 행렬 costMatrix |
비대칭 = A→B 이동비용과 B→A 이동비용이 다름 (일방통행 등 반영) | 비대칭 | 비대칭 | 비대칭 |
| 알고리즘 반복 횟수 iterations |
경로 조합을 몇 번이나 시도할지. 많을수록 더 좋은 결과, 더 긴 시간 | 기본값 | 기본값 | 2,000회 (설정 가능) |
| 결과 항목 | 쉬운 설명 | 공통/차이 |
|---|---|---|
| 차량별 경로 | "1번 차량: A정류장 → B정류장 → C정류장 → ..." 순서 | 3 프로젝트 공통 |
| 활동 유형 | 각 정류장에서 "승차" 또는 "하차" 어느 활동인지 | 3 프로젝트 공통 |
| 예상 도착 시간 | 차량이 각 정류장에 몇 분 후 도착하는지 | 3 프로젝트 공통 |
| 미배정 승객 | 차량이 부족하거나 제약 조건에 맞지 않아 배정 못한 예약 | iksan: "no result" 기록 / goyang: "취소" 처리 |
| 항목 | 익산 / 원주 | 고양 |
|---|---|---|
| 사용 함수 | pgr_withPointsCostMatrix | pgr_trsp |
| 쉬운 설명 | 정류장 좌표에서 가장 가까운 도로를 찾아 자동으로 거리표 생성 | 좌회전 금지, U턴 금지 같은 회전 제한까지 반영하여 더 현실적인 거리 계산 |
| 왜 이 함수를? | 비교적 단순한 도로 환경 (농촌/소도시) | 도심(고양시)에서 회전제한이 많아 더 정확한 경로가 필요 |
| 도달 불가 처리 | 오류 발생 | 매우 큰 비용(999999) 부여 → 알고리즘이 자연스럽게 회피 |
| 경로 시각화 | 없음 | 있음 — 운전자 앱에 지도로 경로를 보여주기 위한 geometry 데이터도 별도 생성 |