가능한 한 적은 수의 상자에 제품을 가장 잘 수용 할 수있는 운송 견적을 작성하는 작업을 받았습니다.
알려진 각형 상자 크기의 유한 세트가 있습니다
상자 안에 포장 할 임의의 각형 항목이 많이 있습니다
적은 수의 상자가 가장 잘 사용해야합니다. 2 개의 상자 1x1x1을 배송하는 것이 1 개의 상자 1x2x1보다 훨씬 비쌉니다. 이것이 우선입니다.
또한 작은 상자를 가능한 한 두 번째 수준 우선 순위로 사용하도록 최적화해야합니다. (예 : 하나의 큰 상자와 두 개의 작은 상자 중 하나를 선택하면 더 큰 상자를 선택해야합니다)
상자에 맞게 항목을 회전 할 수 있지만 회전을 최소 45 ° 씩 제한해야합니다 (제 연구에서 일부 구성에서는 큰 사각형 상자 안에있는 사각형 상자에 더 잘 맞도록 45도 회전 할 수있는 것으로 보입니다) , 90 ° 회전하면 표준이 적용됩니다.
상자에는 무게 제한이 있으며 품목에는 임의의 무게가 있습니다 (예 : 크기가 1x1x1 인 품목은 다른 2x2x2 품목보다 더 움직일 수 있음)
나는 약간의 연구를 통해 빈 포장 및 배낭 문제에 대한 추상 알고리즘을 발견했으며 가장 적합한 알고리즘과 비슷한 다음과 같은 약간의 무차별 변형을 제공했습니다.
"포장 할 품목"목록에서 품목을 감소하는 수량 순서 (먼저 큰 순서)로 정렬
이 목록의 각 항목에 대해 :
"사용 된 상자"목록에있는 작은 상자를 선택하고 품목에 맞게 충분한 양과 무게 제한이 있어야합니다 (치수와 무게를 맞추기 위해 여기에 적합 함을 사용합니다)
그러한 상자가 없으면 항목의 크기와 무게에 맞는 가장 작은 크기의 알려진 가능한 상자 크기에서 새 상자를 만들어 "사용 된 상자"목록에 추가하십시오.
피팅 기능 벨로우즈를 사용하여 상자가 항목에 맞는 경우 "이 상자의 항목"목록에 추가하고 "맞춤 항목"목록에서 상자를 제거하여 상자 내부의 상대적 3d 위치를 표시하십시오.
"포장 할 품목"목록에 장착 할 품목이 없을 때까지 2.1부터 반복하십시오.
위의 2 단계에서 사용 된 피팅 점검 기능 :
상자의 남은 부피가 품목의 부피에 맞는지 확인하십시오. 그렇지 않으면 false를 리턴하십시오.
"상자 항목"무게와 현재 항목 무게의 합이 상자 무게 제한보다 작거나 같은지 확인하십시오. 그렇지 않으면 false를 리턴하십시오.
"상자 항목"목록을 확인하여 Y 구성 요소가 가장 작고 항목의 너비, 깊이 및 높이에 충분한 공간이있는 다른 상자를 사용할 수없는 공간으로 고려한 첫 번째 상자 좌표를 선택하십시오.
항목이 현재 방향에 맞지 않으면 단순성을 위해 45 ° 회전을 가정하지 않고 가능한 6 가지 회전 중 하나로 회전시킵니다. (이미 테스트 한 위치에서 건너 뛸 수있는 회전은 건너 뛸 수 있습니다. 예 : 상자를 180 ° 회전하면 모든 상자와 항목의 크기가 반대쪽면에 대해 동일하므로 건너 뛸 수 있으므로 원래 위치와 동일한 크기로 조정됩니다.)
항목이 가능한 모든 방향으로 원래 방향으로 돌아 가지 않은 경우 3 단계부터 다시 시도하십시오.
시도했지만 적합하지 않은 모든 회전이 발견되면 현재 좌표를 사용할 수없는 공간으로 간주하십시오.
확인할 공간이 없으면 false를 반환합니다. 그렇지 않으면 3 단계부터 다시 시도하십시오.
제시된 제약 조건을 감안할 때 내 문제에 대한 최상의 해결책이 있는지 알고 싶습니다.
이것은 이론에서 작동하는 것 같지만 코드에서는 시도하지 않았습니다. 올바른 방향으로 가고 있는지 또는 더 잘 수행하는 방법이 있는지 알고 싶습니다.
참조가 좋을 것입니다.
편집하다:
원하는 것을 수행하는 재미있는 타사 API를 찾았지만 연결을 끊어야하므로 이에 액세스 할 수 없습니다.
몇 가지 예는 다음과 같습니다.
편집 2 :
해결해야 할 문제의 실제 예는 다음과 같습니다.
- 4 개의 상자 크기 WxHxD : 10x12x18, 12x16x24, 16x20x30, 24x32x40
- 크기 6x8x10, 2x 22x14x30 및 1x 22x4x20의 1 인 4 개의 주문이 있습니다.
가능한 적은 수의 상자를 사용하고 가능한 한 가장 작은 상자를 사용하고 가능한 여유 공간을 적게 남겨두면 하나 이상의 크기의 상자에이 품목을 맞추려면 어떻게해야합니까?
packing
관련 태그 가 필요하지 않습니다 .algorithms
충분 :)