01 — 엔진
엔진은 하나, 제약은 데이터로.
핵심은 외부 의존성이 없는 C++17 메타휴리스틱 엔진과 Python 바인딩입니다. 문제마다 작은 도메인 모델을 올리고, 업무 규칙이나 선호 조건은 제약 플러그인으로 넣고 빼거나 가중치를 바꿔 조정합니다. 솔버 코드는 한 줄도 고치지 않습니다.
- 빠르게, 필요한 만큼만
- 해를 조금 바꿀 때마다 영향을 받은 부분만 다시 계산합니다. 그래서 코어 하나로도 1초에 수백만 개의 후보를 살펴봅니다.
- 말보다 숫자로
- Google OR-Tools와 같은 문제, 같은 시간 조건으로 비교하고, CVRPLIB, Li & Lim, Patterson 같은 공개 데이터셋으로도 측정합니다. 모든 해는 따로 다시 채점해 검증하며, 결과는 벤치마크 페이지에서 볼 수 있습니다.
- pip install optimaru
- 모든 유스케이스가 Python 패키지 하나에 들어 있습니다. Linux, macOS, Windows용으로 미리 빌드되어 있어 몇 줄이면 풀 수 있고, 운영 중인 서비스에 넣어 쓸 수도 있습니다.
- 제약은 플러그인으로
- 필수 규칙과 선호 조건은 모두 이름, 가중치, 필수/선호 여부를 가진 플러그인입니다. 프로젝트마다 넣고 빼도 솔버 코어는 바뀌지 않고, 같은 규칙은 엔진에서도, 참조 모델에서도, 화면에서도 똑같이 동작합니다.
$ pip install optimaru
from optimaru import vehicle_routing as vrp
from optimaru.vehicle_routing.constraints import (
get_constraints, VehicleCapacityCost, UnassignedVisitsCost,
TravelTimeCost, MaxRouteDurationCost,
)
# One depot in Seoul and four customers: (latitude, longitude).
locations = [vrp.Location(*p) for p in [
(37.5665, 126.9780), # 0: depot
(37.5796, 126.9770), (37.5512, 126.9882),
(37.5443, 127.0557), (37.5133, 127.1001),
]]
vehicles = [vrp.Vehicle(f"V{i}", capacity=10, home_location_index=0,
departure_time=9 * 3600, max_route_duration=4 * 3600)
for i in (1, 2)]
visits = [vrp.Visit(f"C{i}", f"Customer {i}", location_index=i, demand=4,
min_start_time=9 * 3600, max_end_time=18 * 3600,
service_duration=600)
for i in range(1, 5)]
plan = vrp.VehicleRoutePlan("demo", locations, vehicles, visits)
config = vrp.SolverConfig()
config.spent_limit_seconds = 5
solver = vrp.Solver(config)
# Plug in only the rules you need, weighted your way.
solver.solve_with_constraints(plan, get_constraints([
VehicleCapacityCost(),
UnassignedVisitsCost(),
TravelTimeCost(weight=10),
MaxRouteDurationCost(level="hard"),
]))
print(plan.score) # 0hard/0medium/-12430soft
print(plan.routes()) # {'V1': ['C3', 'C4'], 'V2': ['C1', 'C2']} 02 — 솔루션
네 가지 분야, 22가지 유스케이스.
모두 저마다의 제약, 테스트, 벤치마크를 갖추고 실제로 돌아가는 모델입니다. 발표용 슬라이드가 아니라, 고객의 규칙에 맞춰 바로 고쳐 쓰는 출발점입니다.
- 01 경로 · 물류 차량 경로 최적화 (VRP) · 픽업 · 배송 (PDPTW) · 오더 피킹 · 시설 입지 선정 4 개 유스케이스 →
- 02 스케줄링 직원 · 간호사 근무표 · 항공 승무원 배정 · 정비 일정 · 프로젝트 일정 (RCPSP) · 반도체 팹 스케줄링 · 생산 라인 순서 계획 · 업무 배정 · 회의 일정 8 개 유스케이스 →
- 03 시간표 학교 시간표 · 학회 일정 · 스포츠 리그 일정 · 대회 일정 4 개 유스케이스 →
- 04 배정 · 적재 병상 배정 · 빈 패킹 (상자 채우기) · 배낭 문제 · 항목 선택 · 조립 라인 밸런싱 · 이차 할당 (QAP) · 맥스컷 · 그래프 분할 6 개 유스케이스 →
04 — 시작한 이유
배송, 병원 근무표, 학교 시간표 뒤에서는 조합최적화가 조용히 돌아가고 있습니다. 그런데 대부분의 팀은 아직도 비싼 블랙박스 솔버와, 현실의 제약 하나만 만나도 무너지는 연구용 코드 가운데 하나를 골라야 합니다. 쓰기 쉽고 현장에서도 버티는 오픈소스 엔진을 만들려고 optimaru를 시작했습니다.
— 강승현, 창업자 · 회사 소개 →
배차나 일정 문제로 고민하고 계신가요?
지금 쓰고 계신 규칙을 보내 주세요. 최적화가 도움이 될지, 된다면 얼마나 될지 솔직하게 말씀드리겠습니다.