상품 배송을위한 3D 포장 알고리즘


24

가능한 한 적은 수의 상자에 제품을 가장 잘 수용 할 수있는 운송 견적을 작성하는 작업을 받았습니다.

  1. 알려진 각형 상자 크기의 유한 세트가 있습니다

  2. 상자 안에 포장 할 임의의 각형 항목이 많이 있습니다

  3. 적은 수의 상자가 가장 잘 사용해야합니다. 2 개의 상자 1x1x1을 배송하는 것이 1 개의 상자 1x2x1보다 훨씬 비쌉니다. 이것이 우선입니다.

  4. 또한 작은 상자를 가능한 한 두 번째 수준 우선 순위로 사용하도록 최적화해야합니다. (예 : 하나의 큰 상자와 두 개의 작은 상자 중 하나를 선택하면 더 큰 상자를 선택해야합니다)

  5. 상자에 맞게 항목을 회전 할 수 있지만 회전을 최소 45 ° 씩 제한해야합니다 (제 연구에서 일부 구성에서는 큰 사각형 상자 안에있는 사각형 상자에 더 잘 맞도록 45도 회전 할 수있는 것으로 보입니다) , 90 ° 회전하면 표준이 적용됩니다.

  6. 상자에는 무게 제한이 있으며 품목에는 임의의 무게가 있습니다 (예 : 크기가 1x1x1 인 품목은 다른 2x2x2 품목보다 더 움직일 수 있음)

나는 약간의 연구를 통해 빈 포장 및 배낭 문제에 대한 추상 알고리즘을 발견했으며 가장 적합한 알고리즘과 비슷한 다음과 같은 약간의 무차별 변형을 제공했습니다.

  1. "포장 할 품목"목록에서 품목을 감소하는 수량 순서 (먼저 큰 순서)로 정렬

  2. 이 목록의 각 항목에 대해 :

    1. "사용 된 상자"목록에있는 작은 상자를 선택하고 품목에 맞게 충분한 양과 무게 제한이 있어야합니다 (치수와 무게를 맞추기 위해 여기에 적합 함을 사용합니다)

    2. 그러한 상자가 없으면 항목의 크기와 무게에 맞는 가장 작은 크기의 알려진 가능한 상자 크기에서 새 상자를 만들어 "사용 된 상자"목록에 추가하십시오.

    3. 피팅 기능 벨로우즈를 사용하여 상자가 항목에 맞는 경우 "이 상자의 항목"목록에 추가하고 "맞춤 항목"목록에서 상자를 제거하여 상자 내부의 상대적 3d 위치를 표시하십시오.

    4. "포장 할 품목"목록에 장착 할 품목이 없을 때까지 2.1부터 반복하십시오.

위의 2 단계에서 사용 된 피팅 점검 기능 :

  1. 상자의 남은 부피가 품목의 부피에 맞는지 확인하십시오. 그렇지 않으면 false를 리턴하십시오.

  2. "상자 항목"무게와 현재 항목 무게의 합이 상자 무게 제한보다 작거나 같은지 확인하십시오. 그렇지 않으면 false를 리턴하십시오.

  3. "상자 항목"목록을 확인하여 Y 구성 요소가 가장 작고 항목의 너비, 깊이 및 높이에 충분한 공간이있는 다른 상자를 사용할 수없는 공간으로 고려한 첫 번째 상자 좌표를 선택하십시오.

  4. 항목이 현재 방향에 맞지 않으면 단순성을 위해 45 ° 회전을 가정하지 않고 가능한 6 가지 회전 중 하나로 회전시킵니다. (이미 테스트 한 위치에서 건너 뛸 수있는 회전은 건너 뛸 수 있습니다. 예 : 상자를 180 ° 회전하면 모든 상자와 항목의 크기가 반대쪽면에 대해 동일하므로 건너 뛸 수 있으므로 원래 위치와 동일한 크기로 조정됩니다.)

  5. 항목이 가능한 모든 방향으로 원래 방향으로 돌아 가지 않은 경우 3 단계부터 다시 시도하십시오.

  6. 시도했지만 적합하지 않은 모든 회전이 발견되면 현재 좌표를 사용할 수없는 공간으로 간주하십시오.

  7. 확인할 공간이 없으면 false를 반환합니다. 그렇지 않으면 3 단계부터 다시 시도하십시오.

제시된 제약 조건을 감안할 때 내 문제에 대한 최상의 해결책이 있는지 알고 싶습니다.

이것은 이론에서 작동하는 것 같지만 코드에서는 시도하지 않았습니다. 올바른 방향으로 가고 있는지 또는 더 잘 수행하는 방법이 있는지 알고 싶습니다.

참조가 좋을 것입니다.

편집하다:

원하는 것을 수행하는 재미있는 타사 API를 찾았지만 연결을 끊어야하므로 이에 액세스 할 수 없습니다.

몇 가지 예는 다음과 같습니다.

편집 2 :

해결해야 할 문제의 실제 예는 다음과 같습니다.

  • 4 개의 상자 크기 WxHxD : 10x12x18, 12x16x24, 16x20x30, 24x32x40
  • 크기 6x8x10, 2x 22x14x30 및 1x 22x4x20의 1 인 4 개의 주문이 있습니다.

가능한 적은 수의 상자를 사용하고 가능한 한 가장 작은 상자를 사용하고 가능한 여유 공간을 적게 남겨두면 하나 이상의 크기의 상자에이 품목을 맞추려면 어떻게해야합니까?


4
packing관련 태그 가 필요하지 않습니다 . algorithms충분 :)
크리스 Cirefice

궁금합니다. 실제 포장이 로봇이나 사람에 의해 수행됩니까? 후자 인 경우 공간 최적화는 각 상자를 회전시키는 방법을 알아내는 데 필요한 시간만큼 가치가 있습니까?
foraidt

좋은 질문. 실제 포장은 사람이 수행하지만 소프트웨어는 각 상자의 포장 순서와 위치를 제안합니다. 포장에 경험이 없어도 제공된 레이아웃을보고 상자 안에 물건을 넣을 수 있습니다. 처음에는 익숙해지기까지 어느 정도 시간이 걸리지 만 최선의 처분에 대해 생각할 필요는 없습니다.
Ricardo Souza

1
모든 @ msw가 말하는 것은이 유형의 문제가 "완벽한"솔루션에 적합하지 않을 것입니다. 그러나 규칙에 따라 휴리스틱으로 합리적인 시간에 발견되는 수용 가능한 솔루션에 더 적합합니다. 제공되었습니다. 수학적 관점에서, 이것은 종종 다른 알고리즘과 도구 세트로 접근한다는 것을 의미하므로, 나는 단지 그것을 추천한다고 생각합니다. 예를 들어, 유전 알고리즘, 시뮬레이션 어닐링 및 휴리스틱과 관련하여 솔루션 공간을 근사하는 경사 하강 곡선을 따르는 다른 방법이 여기에 이점을 제공 할 수 있습니다.
J Trana

1
나는 여기에 아이디어를 게시하고 있습니다. 효과가 없다고 생각되면 무시해도됩니다. 이 솔루션 (최적화와 유사)은 실제로 알고리즘의 입력이 얼마나 유사한 지에 달려 있습니다. 따라서 입력 내용이 시간이 지남에 따라 약간 유사하다는 사실을 이용하십시오. 계산 된 결과를 저장 / 캐시 (고가의 계산 복잡도를 가짐) 한 다음 입력과 비교할 수 있으며 전체 일치 또는 부분 일치가있는 경우 일부 작은 크기의 개체를 재정렬하기 위해 몇 가지 계산 만 수행하면됩니다. 물론 이것은 새로운 문제를 일으킨다.
JAAAY

답변:


4

빈 포장은 계산 상 매우 어렵습니다. 문제의 절반을 생각하십시오. 상자에 낭비가없는 운송 상자에 제품을 포장하려고합니다. 이를위한 최적의 솔루션은 모든 가능한 서브 세트와 하나의 트럭으로 배송해야하는 제품의 모든 가능한 3D 배열을 거쳐야합니다. 아침 식사 전에 여섯 가지 불가능한 일을하는 친구가 있기 때문에 최적의 솔루션을 제공 할 것입니다.

이제 낭비없이 트럭의 모든 상자를 가져와야합니다. 내 친구는 그의 두 번째 불가능한 일을하고 당신에게 해결책을 제공합니다. 불행히도 위에서 선택한 상자 크기로 인해 트럭에 빈 공간이 있으므로 첫 번째 작업에서 다른 (더 크거나 작은) 상자를 선택하면 줄일 수 있습니다. 한 상자의 크기를 변경하면 트럭을 다시 포장해야합니다. 최악의 경우, 우리가 시작한 문제만큼 어려운 모든 상자를 다시 포장해야 할 수도 있습니다. 첫 단계와 마찬가지로 가능한 모든 3D 배열을 시도해야합니다.

Skiena의 The Algorithm Design Manual 은 어떤 종류의 알고리즘이 어떤 종류의 문제에 적합한 지 생각하는 데 도움이된다는 것을 알았지 만 평범한 문제조차도 좋은 해결책이 계산상의 어려움에 직면한다는 것을 배웠습니다. 당신이 필요로하는 것의 대부분은 빈 포장 문제 의 클래스에 적합 하고 그 기사는 좋은 출발점입니다. 이 작업에 대한 최고의 알고리즘 중 일부는 상용 제품이라는 점은 주목할 가치가 있습니다.이 작업은 물류의 모든 곳에서 나타납니다 (내 물건을 가져올 수있는 가장 적은 수의 열차가 무엇입니까? 등). 올바른 휴리스틱 스로 인해 제조업체가 한 달에 100 대의 열차를 절약 할 수 있다면 상당한 돈을 벌 수 있습니다.

불행하게도 휴리스틱 최적화에 관한 문헌은 알고리즘만큼 크지 않습니다. 당신이 혼자 가려고하면, 나는 당신이 두 번째 달까지 직사각형 프리즘을 움직이는 것에 대해 꿈을 꾸게 될 것이라고 보장합니다. 나는 다시해야한다면 아마도 전문가 (또는 그들의 독점 소프트웨어)에게 농사를 짓는 절단 문제가 있었다.

내 의견의 훌륭한 확장을 위해 @JTrana에게 감사드립니다.


의견을 보내 주셔서 감사합니다. 내가 질문에 대해 말했듯이, 나는 이미이 주제에 대해 연구했으며 위의 것을 제안하기 위해 몇 가지 알고리즘을 혼합했습니다. 나는 포장 자체에 대해서만 걱정하고 있습니다. 이 모든 상자는 우체국 서비스를 통해 발송됩니다. 다행스럽게도 트럭 적재를 처리하지 않아도됩니다.
Ricardo Souza 14:01에

그것은 내 설명의 좋은 부분이었습니다. 서비스 비용을 지불하고자하는 회사에서 알고리즘을 "추출"할 수 없습니다. 나열된 두 회사에는 API가 있지만 패킹은 서버에서 수행되며 도난을 제외하고는 구현 코드에 액세스 할 수 없습니다. 트럭을 포장 할 필요가없는 것이 좋습니다. 이제는 문제가 절반에 불과하므로 기업이 솔루션을 판매하고 사람들이 서비스를 기꺼이 구매하려고합니다.
msw

1
우리는 여기에 잘못된 커뮤니케이션이 있다고 생각합니다. 나는 나에게 잘 표현하지 않았을 수도 있습니다 (당신이 알듯이 영어는 모국어가 아닙니다). 알고리즘을 훔칠 것을 요구하지 않습니다. 주제에 대한 설명을 위해 여기에 왔습니다. 나는 약간의 연구를 수행하고 analisys에 대한 위의 예를 제시했습니다. 아마도 더 나은 지시를 줄 수있는 동일한 문제에 직면 한 사람이있을 수 있습니다. 솔루션을 적용 할 수없는 경우 더 나은 결과를 얻으려면 어떻게해야합니까? 이것은 저의 진짜 질문입니다. 내가 더 명확 해 졌으면 좋겠다.
Ricardo Souza

당신의 영어는 괜찮습니다; 문제는 우리가 작업의 다른 계층에 대해 이야기하고 있다는 것입니다. 당신은 구현을 생각하고 있고 조합 폭발을 생각하고 있습니다. Edit 2 를 해결 하면 내가보고있는 방식으로 문제를 더 잘 이해하는 데 도움이 될 것이라고 생각 합니다. 명시된대로 해결할 수 있습니까? 낭비가 없으면 최소 크기의 상자가 최소입니까? 그것이 제가 전에 언급 한 다중 최적화 문제입니다. 불가능하다고 말했습니다. 다른 요소를 최적화하려면 이러한 요소 중 하나 이상을 희생해야합니다.
msw

고맙습니다. 나는 지금 그것을 얻었다 생각합니다. 나는 그것을 코딩하려고하지 않았다. 나는 처음에 인용을하기 때문에보다 구체적인 솔루션이나 제안에 대한 긍정적 인 피드백이 발생하기 전에 시간 코딩을 낭비하지 않을 것이라고 생각했습니다. 나는 여전히 연구하고 있지만 그 API 중 하나를 가져 와서 장치 (Win CE 6.0을 실행하는 데이터 수집기)가 인터넷에 연결되어 있는지 확인할 수 있습니다. 내가 고객으로부터 얻은 첫 번째 정보는 직장에서 인터넷에 액세스 할 수 없다고 말했습니다.
Ricardo Souza

1

새로운 알고리즘을 만들 때 최근에 패킹 알고리즘을 직접 수행했습니다 (아직 최적화 가능성이 있음을 알고 있음). 나는 항상 가장 간단한 접근법을 수행합니다.

내가 어떻게 인간으로서 그것을하고 트로이를 알고리즘으로 번역하려고 시도하겠습니까 : 내 (로봇) 인공 지능 선생님 Rolf Pfeifer로부터 나는 여전히 명심하고 있습니다. 명백한 지능은 때로는 매우 단순한 규칙으로 만들어 질 수도 있습니다. 저 공학을 시도합니다

  1. 너무 큰 품목 식별 (어떤 상자에 맞지 않는 품목)
  2. 가능한 한 최상의 상자를 찾으십시오 (총 부피와 품목 치수를 비교하여).
  3. 큰 것에서 작은 것까지 그리고 작은 것에서 큰 것까지 상자 (공간)를 주문하십시오
  4. 가장 작은 공간에 가장 큰 아이템 맞추기
  5. 가장 큰 품목이 그것을 뛰어 넘지 못하면 더 이상 아무것도 맞지 않을 때까지 다음 품목을 시도하십시오.
  6. 나머지 항목의 경우 새 최상의 상자를 검색하십시오. ...

    X. 항상 예외적 인 이벤트 (크기가 큰 항목, 이상한 양식, 상자에 하나의 항목 만 포함 된 경우 상자가없는 항목을 보내는 것이 좋지 않습니까? 등)에 대해 생각하지만 결정의 형태로 휴리스틱을 만들 수도 있습니다. 나무.

물론 더 많은주의 사항이있을수록이 아이디어를 시작점으로 제공합니다. 거기에서 가능한 많은 방법이 있습니다. 한 가지 대안은 상자를 작은 입방체 (예 : 5cmx5cmx5cm)로 나누고 점유 / 자유로 추적하여 다른 접근 방식을 3d 테트리스라고하는 것입니다.

이 방법을 사용하면 반드시 조합 폭발에 대해 걱정할 필요가 없습니다. 다른 한편으로, 우리가 품목의 트레인로드에 대해 이야기하면 결합 폭발이 발생할 수 있습니다. 그러나 다시 한 번 : 회사가 포장 목록 항목을 품목별로 점검 할 것이라고 정말로 생각하십니까? 분할 및 정복 솔루션에는 접근 할 수 없습니다. 표준화 된 볼륨 (예 : 팔레트 또는 고정 크기 상자)을 사용하여 복잡성을 나눕니다. 따라서 실습을 위해서도 기차뿐만 아니라 직원의 시간도 돈이라는 점을 고려하십시오. 열차는 x 팔레트를 적재 할 수 있고, 모든 팔레트에는 고정 된 부피가 있으므로, 아이템을 팔레트로 포장하십시오. 그러나 다시, 팔레트는 여러 주문으로 구성 될 수 있으므로, 아이템에 고정 상자를 사용하여 팔레트에로드 한 다음로드합니다 기차로.

적어도 그것이 인간으로서 내가 작업을 처리하고, 최상의 상자를 얻은 다음 가장 작은 공간에서 가장 큰 항목을 하나씩 맞추는 방법입니다 (그리고 약간의 미리보기를 추가하십시오).

내 알고리즘에서와 마찬가지로 결국에는 최상의 솔루션이 없지만 더 좋은 휴리스틱을 사용하여 더 세분화 할 수 있습니다.

때로는 첫 번째 단계로 시작하고가는 길에서 문제를 해결하는 것이 더 쉬울 수 있습니다. 물론 이상적인 단계를 넘어서는 것이 아니라 조금 똑똑합니다. 때로는 때로는 대안을 탐색하고 선택해야 할 수도 있습니다. 가장 좋은 것 또는 "뒤로"를 구현하십시오.

그러나 AI 선생님 (Rolf Pfeifer, 다시 신경 쓰지 않아서 미안합니다)에서 배운 것처럼 : 때로는 매우 간단하고 규칙이 거의없는 명백한 지능형 행동을 만들 수 있습니다. 오른쪽에서 장애물을 감지하고 왼쪽에 장애물이 있으면 오른쪽으로 돌고 장애물이 없거나 앞쪽에 있으면 직진합니다. 3 ~ 4 개의 로봇은 3m x 3m 크기의 정사각형에 탁구 공이 많이 들어있어 로봇이 청소 중일 때도 탁구 공을 모서리로 밀면서 청소하는 것처럼 보였습니다. 장애물을 피하도록 프로그래밍되었습니다.

PD :이 접근법에서 내가 찾은 유일한 실제 편차는 메탈리카, 아이언 메이든, 브리트니 스피어스, 폴 맥카트니, U와 같은 큰 콘서트의 무대로 일할 때였습니다. 국제 여행에는 품목별로 정확한 포장 목록이 있습니다. 계산은 한 번만 수행 한 후 (인간이나 기계는 알지 못함) 복제되었습니다. 때로 처음 포장 할 때 현지 승무원이 언제 어디서 충전해야하는지 정확하게 알 수 있도록 레이어별로 그림을 만들어 트럭에 고정하기도합니다. 그러나 이것은 한 번의 여행에서 항상 같은 상자와 트럭으로 작동하는 특정 포장 요구 사항입니다.


1

게시물에 언급 한 휴리스틱이 흥미로워 보입니다.

최종 솔루션을 개선하기 위해 몇 가지 수정을 제안합니다.

한 상자에 모든 품목이 포장되어있는 솔루션을 고려할 때 두 개의 작은 상자의 내용을 하나의 큰 상자에 병합하십시오 (가능한 한 적은 수의 상자를 사용하는 기준을 개선하는 데 도움이 됨).

또는 현재 상자를 수용 할 수있는 가장 작은 상자를 사용하는 대신 새 상자를 시작할 때마다 상자를 수용 할 수있는 가장 큰 상자를 선택하고 모든 항목이 상자에 할당되면 상자의 모든 항목을 할당 해보십시오. 작은 상자에 박스.

또한 피팅 기능에서 다른 상자의 위치를 ​​고정 된 것으로 간주하지 않고 로딩 순서를 변경하는 것을 상상할 수 있습니다. 이를 통해 실행 시간이 길어지면서 더 나은 솔루션을 찾을 수 있습니다.


흥미로운 개선으로 보입니다. 나는이 문제를 오랫동안 만지지 않았다. 어쩌면 나는 오늘 중 하나를 시도해야합니다. 감사.
Ricardo Souza
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.