컬리의 Virtual 물류 센터

Picking 공정 시뮬레이션의 구축부터 활용까지

안녕하세요, 컬리 데이터서비스개발팀의 Data Scientist 박수형입니다. 최근 다양한 산업 분야에서 모델링 및 시뮬레이션(M&S) 기반의 디지털 트윈을 활용해 복잡한 비즈니스 문제를 효과적으로 해결하는 사례가 늘고 있습니다. 디지털 트윈의 근간이 되는 시뮬레이션 기술은 실제 시스템을 가상의 환경에 재현해 다양한 시나리오를 실험하고 문제를 사전에 예상하며 최적의 해결책을 모색하는 데 큰 도움이 되는데요. 컬리 또한 M&S 기술을 적극적으로 도입하여 물류센터 내 다양한 현상을 분석하고, 이를 바탕으로 각 공정의 개선 작업을 수행하고 있습니다. 특히 최근에는 Picking(이하 피킹) 공정에 대한 시뮬레이션을 개발하여 의사결정이 더욱 신속하고 효율적으로 이루어지도록 지원하고 있습니다. 이번 글에서는 피킹 시뮬레이션 구축 과정과 활용 사례를 자세히 살펴보겠습니다.

피킹이란?

피킹은 출고 대상 상품을 각 적치 공간에서 꺼내 오는 공정을 말합니다. 개별 작업자에게 피킹잡(= 여러 피킹 작업의 묶음) 단위의 작업 지시를 내리면, 아래의 사진처럼 작업자가 카트를 끌고 안내되는 위치로 이동하여 물건을 바구니에 담게 됩니다. 작업자는 할당된 지시를 완료하기까지 창고를 돌아다니며 이 작업을 반복합니다.

picking_gimpo
컬리 김포 물류 센터의 피킹 공정
© 2024. Kurly. All right reserved.

이처럼 대부분의 작업이 사람에 의해 이루어지다 보니, 현장에서는 여러 난관이 있기도 하는데요. 예를 들어, 통로에서 작업자 간 병목이 생기거나 동선이 길어져 시간이 지연되는 경우가 있습니다. 이와 같은 부분들을 개선하기 위해 다양한 아이디어들이 제시되었으나, 어떤 방안이 실무에서 도움이 될지 판단하는 것은 쉽지 않은 일이었습니다.

기존의 어려움

‘물건을 적치하는 위치를 변경하면 어떤 효과가 있을까?’와 같은 질문에 대해, 저희는 주로 두 가지 접근 방식을 통해 답을 도출해 왔습니다. 첫 번째는 과거 데이터를 기반으로 한 분석이며, 두 번째는 실제 환경에서의 실험입니다. 그러나 과거 데이터는 이미 발생한 상황만을 반영하기 때문에, 환경 변화를 시도했을 때의 미래 결과를 예측하는 데는 근본적인 한계가 존재합니다. 또한, 물류 센터에서 개선안을 직접 실험하는 것은 운영과 병행해야 하는 현실적인 제약으로 인해 진행이 어려우며, 설령 실험을 하더라도 관찰자로 인해 의도치 않은 개입과 그로 인한 편향된 결과가 발생할 수 있습니다. 이를 극복하고자, 저희는 시뮬레이션 기법을 도입하여 조건이 변경되었을 때 미래의 환경에 끼칠 영향을 더 정확하게 예측하고 개선안을 객관적으로 평가할 방법을 마련했습니다.

시뮬레이션을 만들어 보자

시스템을 정의하기

시뮬레이션 모델링을 위해서는 먼저 실제 시스템에서 구현할 요소를 명확히 정의해야 합니다. 대상 시스템인 피킹 공정에서는 많은 작업자가 동시에 여러 사건을 발생시키지만, 이상적인 상황에서 각각의 작업자는 독립적으로 작업을 수행하며 작업자들 간의 상호작용은 존재하지 않습니다. 시스템이 복잡해 보일 수 있지만 실제로는 간단하게 이해할 수 있는 구조로 되어 있음을 의미합니다.

시스템을 보다 명확히 이해하고 정의하기 위해 DEVS 형식론을 이용하여 각 작업자의 관점에서 시스템을 아래와 같이 명세하였습니다. 원은 State 그리고 선은 Transition을 의미하며, 여기서 Transition은 Input event에 의해 발생하는 경우(실선)와 Elapsed time이 지나면 발생하는 경우(점선)로 나뉩니다. Input event와 Elapsed time은 각각 Transition과 State에 기재되어 있습니다.

picking_devs
피킹 공정에 대한 DEVS 모델
© 2024. Kurly. All right reserved.

위 시스템에서 작업자는 명령을 기다리는 상태로 시작합니다(Wait). 피킹잡이 작업자에게 할당되면 우선순위의 작업을 확인한 후(Check) 지정된 목적지로 이동합니다(Move). 목적지에서 작업자는 물품을 바구니에 적재합니다(Pick). 할당되었던 모든 작업이 완료되었음을 확인하면(Check) 작업자는 컨베이어로 이동하여(Move) 컨베이어에 바구니를 올리고(Load) 다음 할당을 위해 대기하는 상태로 전환됩니다(Wait).

AnyLogic 모델 개발하기

앞선 과정을 통해 정의된 시스템을 바탕으로, Java 기반의 시뮬레이션 개발 도구인 AnyLogic을 이용하여 가상의 공간에 피킹 공정을 구현하였습니다. 저희의 시뮬레이션 모델은 크게 Main과 Process 두 개의 레이어로 나눌 수 있는데요. 작업자의 수만큼 생성되는 Process 레이어는 한 명의 작업자에 대한 작업 흐름을 나타내며, 여러 작업자가 병렬적으로 일하는 상황을 기술적으로 모사하기 위해 Main 레이어에서 독립적으로 구분했습니다. 이에 따라 Main 레이어에서는 작업자에게 할당할 피킹잡을 생성하고 각 Process 레이어에서는 작업자에게 이를 전달하여 피킹 공정을 수행하게 됩니다.

피킹잡을 비롯하여 복합적인 환경을 구성하기 위한 요소들은 Main 레이어에 위치합니다. 아래에서 보실 수 있듯이 순서도와 더불어서 역할에 따라 요소가 분류되어 있는 것을 알 수 있습니다.

picking_main_layer
Main 레이어
© 2024. Kurly. All right reserved.

이 중, 대표적인 요소들을 표로 정리하였습니다. 이러한 요소는 시뮬레이션 시작과 함께 초기화되거나 필요에 따라 로직에서 호출되어 사용됩니다.

Name Type Description
locationKey Agent SKU가 적치될 위치를 의미하며, storage에 할당
sku Agent SKU에 대한 정보(부피, 무게 등)를 포함하며, locationKey에 할당
batch Agent 작업자가 처리해야 하는 피킹잡을 의미하며, 피킹 대상에 대한 정보를 포함
picker Agent 피킹을 수행할 작업자를 의미하며, batch가 할당
pickerPool ResourcePool picker에 대한 속성(속력 등)을 설정
skuStorage StorageSystem 개별적인 storage를 묶어 피킹 구역을 설정

Process 레이어의 구성은 기본적으로 위에서 정의하였던 DEVS 모델과 동일합니다. DEVS 모델의 State를 기반으로 로직을 설명해 보겠습니다.

  • Check : 작업자에게 할당된 피킹잡에서 우선순위에 따라 작업 대상을 추출
  • Move → Pick : 작업 대상의 위치로 이동하여 피킹을 수행
  • Move → Load : '바구니가 부족할 경우' 혹은 '피킹잡의 모든 작업이 종료되었을 경우', 컨베이어로 이동하여 로딩을 수행

picking_process_layer
Process 레이어
© 2024. Kurly. All right reserved.

시뮬레이션 상의 작업자 행동에 대한 규칙도 존재합니다. 작업자는 물리적인 장애물(선반, 다른 작업자 등)을 고려하여 목적지까지 최단 경로로 이동하게 되며, 도착한 목적지에 이미 다른 작업자가 피킹 중이라면 해당 작업이 끝날 때까지 기다립니다. 작업자 간의 차이가 존재하는 매개변수(이동 속도, 작업 시간 등)는 확률 분포를 기반하여 동적으로 결정되며, 특히 피킹에 소요되는 시간은 상품 관련 변수(개수, 부피, 무게)를 추가로 고려하여 계산합니다.

여기까지 설명해 드린 로직과 요소들의 구현에 아무 문제가 없다면, 서로 맞물려 돌아가며 시뮬레이션이 실행되게 됩니다. 이 과정에서 작업자의 물리적인 이동을 시각적으로 확인할 수 있고, 작업자의 이동 거리나 작업 시간과 같은 생산에 관한 여러 데이터도 수집됩니다.

picking_simulation_3d

시뮬레이션의 3D 뷰
© 2024. Kurly. All right reserved.

모델을 평가하기

개발 과정의 마지막 단계로, 시뮬레이션이 실제 시스템을 충실히 모사하고 있는지 검정을 해보았습니다. 시뮬레이션이 현실을 제대로 설명하고 있다면 동일한 작업 환경에 대해서 시뮬레이션의 출력과 실제값이 유사해야 합니다. 특정 일자의 피킹 작업 데이터를 시뮬레이션에 입력하여 피킹잡 단위의 작업 시간을 도출하였고 실제 데이터와 비교하였는데요. Kolmogorov-Smirnov 검정 결과, 통계적으로 두 분포 간의 차이가 없음을 확인했습니다(p =.99).

picking_validation
실제 시스템과 시뮬레이션에서의 피킹잡당 작업 시간
© 2024. Kurly. All right reserved.

시뮬레이션을 활용해 보자

저희가 시뮬레이션을 구축한 이후, 현장에서 테스트하기 어려웠던 피킹과 관련된 개선안을 시뮬레이션으로 실험하고 결과를 도출하여 여러 부서의 의사결정을 지원해 드리고 있습니다. 그중에서 몇 가지 대표적인 사례를 소개해 드리겠습니다.

피킹 동선 비교

첫 번째는 피킹 동선의 형태가 작업자가 이동해야 하는 거리에 어떠한 영향을 끼치는지 알아본 사례입니다. 피킹은 기본적으로 물건이 적치되어 있는 곳의 번호(= 지번) 순으로 이루어집니다. 아래의 평면도와 같이 통로의 한쪽 면을 따라 번호가 이어진다면 U자 형태의 동선, 통로의 좌우 면을 번갈아 가며 번호가 이어진다면 Z자 형태의 동선이 유도됩니다.

picking_uz
U자와 Z자의 평면도 예시
© 2024. Kurly. All right reserved.

물론 지번의 위치만으로 작업자의 전체 동선이 결정되는 것은 아니었기에, 시뮬레이션을 통해 두 형태의 동선에 실제 작업 데이터를 반영하여 피킹잡당 총거리를 측정하였습니다. 구체적으로 피킹잡 내 SKU 수(= 방문해야 하는 지번 수)에 따라 거리의 증감 효과가 얼마나 변화하는지 분석해 보았는데요. 시뮬레이션 실험 결과, 피킹잡 내 SKU 수가 적은 경우에서는 Z자 형태에서 거리가 감소하며 반대로 SKU 수가 많은 경우에서는 U자 형태에서 거리가 감소하는 경향이 나타났습니다.

picking_box
SKU 수에 따른 U자 대비 Z자의 거리 개선율 (-- : 평균의 추세선)
© 2024. Kurly. All right reserved.

하나의 통로에 대해서 U자 형태의 경우에는 2회의 세로축 이동이 일어나지만, Z자 형태에서는 1회의 세로축 이동에 더해 방문해야 하는 지번 수만큼의 가로축 이동이 발생합니다. 따라서 SKU가 많은 피킹잡에서는 가로축 이동의 총합이 1회의 세로축 이동보다 커져 Z자 형태의 동선이 불리했던 것입니다.

재고 리로케이션

첫 번째로 다룬 사례가 지번의 위치 이동이라면, 두 번째 사례는 상품(= SKU)의 위치 이동입니다. 피킹이 많이 이뤄지는 고빈도 SKU를 피킹 시작 지점과 가까이 배치하는 전략에 대해서 작업 시간의 개선 효과와 함께, 고빈도 SKU를 집중시킴으로써 발생하는 작업자의 병목 현상의 정도를 시뮬레이션 실험으로 알아보고자 했습니다.

특정 피킹 구역에 대해 기존 전략과 신규 전략의 작업자 수에 따른 피킹잡당 작업 시간을 분석한 결과, 6명의 작업자가 투입된 상황에서 작업 시간이 평균 5% 감소했습니다. 다만, 동시 작업하는 인원의 수가 증가할수록 신규 전략의 작업 시간이 더욱 가파르게 증가하였습니다.

picking_sensitivity
작업자 수에 따른 피킹잡당 평균 작업 시간
© 2024. Kurly. All right reserved.

시각적으로 작업자의 밀도를 비교하였을 때도 입구와 가까운 구간의 정체가 기존 대비 신규 전략에서 심해지는 것을 확인할 수 있었습니다. 결론적으로 생산성 개선의 여지가 존재하지만, 투입되는 작업자 수에 따라 병목 현상이 유발될 가능성이 높아지기 때문에 고빈도와 저빈도 SKU를 적절히 배분하여 적치하는 것이 중요하다고 판단되었습니다.

picking_density
작업자가 10명일 때의 밀도 맵
© 2024. Kurly. All right reserved.

앞으로는?

위의 활용 사례와 같이, 컬리에서의 피킹 시뮬레이션은 물리적인 실험 없이 다양한 시나리오의 생산성을 평가하는 지원 도구로서 주로 활용되고 있습니다. 앞으로 저희는 강화 학습 등의 기법을 적용하여 시뮬레이션에서 생산 계획을 최적화할 수 있도록 더욱 고도화할 예정입니다. 장기적으로, 물류 센터 전반에 걸친 디지털 전환을 통해 가상에서 전체 공정을 조망함으로써 생산성을 예측하고 향상하는 것이 저희의 최종 목표입니다. 지금까지 읽어주셔서 감사드리며, 끊임없이 발전해 나가는 컬리의 물류 분야에 많은 관심 부탁드립니다!

그림 작업을 도와주신 권수영님 감사드립니다!