크기가 다른 직사각형을 가능한 한 가장 작은 직사각형에 가장 최적의 방법으로 패킹하는 데 사용할 수 있는 알고리즘은 무엇인가요?

가능한 한 가장 작은 공간(이 공간의 크기는 2의 거듭제곱이어야 함)에 넣어야 하는 직사각형 물체가 여러 개 있습니다.

주어진 공간에 가능한 한 물건을 잘 포장하는 다양한 포장 알고리즘을 알고 있지만, 이 경우에는 그 공간이 얼마나 커야 하는지 계산하는 알고리즘이 필요합니다.

예를 들어 다음과 같은 직사각형이 있다고 가정해 보겠습니다.

  • 128*32
  • 128*64
  • 64*32
  • 64*32

128*128 공간에 포장할 수 있습니다.

 _________________
|128*32 |
|________________|
|128*64 |
| |
| |
|________________|
|64*32 |64*32 |
|_______|________|
그러나 160\*32와 64\*64가 있는 경우 256\*128의 공간이 필요합니다.
 ________________________________
|128*32 |64*64 |64*32 |
|________________| |_______|
|128*64 | |64*32 |
| |_______|_______|
| | |
|________________|___ |
|160*32 | |
|____________________|___________|

여러 개의 직사각형을 패킹하고 컨테이너에 필요한 크기(2의 거듭제곱, 각 치수에 대해 주어진 최대 크기 이내)를 결정할 수 있는 알고리즘에는 어떤 것이 있을까요?

질문에 대한 의견 (8)

지켜보리니 [이 페이지에서 호 프로젝트] (http://www.csc.liv.ac.uk/ ~ epa/surveyhtml.html) 를 대상으로 조사한 결과, 복잡한 구현 솔루션 사이의 상관 관계를 있습니다 / 시간, 최적성) 이 있는데, 다양한 알고리즘을 선택할 수 있습니다.

39 의 추출을 here& 의 알고리즘:

  1. 높이 (페드) 알고리즘입니다 첫 번째 충족합니다 감소 다음 항목을 페드 팩을 ᄅ씨 (비사양 원거리일수록 있는 높이) 의 1 단계 여기서 r 부응합니다. R, 수용할 수 없는 경우 수준을 한 차원 높은 생성됩니다. 시간 복잡도 페드 있다. O (n& # 183, log n). 근사화를 비율: (I) = (17/10) & # 페드 &lt, 183, OPT (I) +1. 이 중 17/10 는 점근 바인딩될 막상막하.
  2. 높이 (노프도) 알고리즘입니다 다음 fit 감소 다음 항목을 노프도 팩을 ᄅ씨 (비사양 원거리일수록 있는 높이) 의 경우 현재 수준의 r 부응합니다. 그렇지 않으면 현재 수준은 &quot closed"; 그리고 새로운 차원의 생성됩니다. 시간 복잡도. O (n& # 183, log n). 근사화를 비율: # 183, OPT (I), (I) = 2& 노프도 &lt +1. 이 중 2 는 점근 바인딩될 막상막하.
  3. 높이 (브랜드) 알고리즘의 최적 감소 다음 항목을 브랜드 팩을 ᄅ씨 (비사양 원거리일수록 있는 높이) 를 수용할 수 있는 공간이 r, 이를 위해 이들 중 단위로레벨에서 잔류 수펑 최소값이. R, 수용할 수 없는 경우 수준을 한 차원 높은 생성됩니다.
  4. 아래 왼쪽 (BL) 알고리즘입니다 첫 번째 항목을 주문하십시오 bl 비사양 원거리일수록 너비입니다. BL 은 가까이 있는 것처럼 항목으로 다음 왼쪽으로 갈 수 있기 때문에 맞지 않을 뿐만 아니라 다음 닫으십시오 중복되지 않은 모든 압축됨 항목설명프로세서. 단, BL 포장 알고리즘입니다 정위되도록 수준 아닙니다. 시간 복잡도. O (n ^ 2). 근사화를 비율: BL (I) = 3& # &lt, 183, OPT (I).
  5. 39 의 위아래 알고리즘입니다 baker& (UD)

    UD) 와 함께 사용하여 bl 의 일반화 노프도. 스트립 너비입니다 정상화 및 항목은 도왔으매 스트립) 는 단위 너비입니다. UD 오더합니까 너버 다음 항목을 5 개 그룹으로 나누어 각각 비사양 원거리일수록 items) 에 너비 (maxvalorarray (1/2, 1] (1/3.1/2] (1/4.1/3] (1/5.1/4] (0.1/5]. 또한, & # R1, & # 5 개 지역에 나뉘어 스트립, & # 183 183 183. , R5. 기본적으로, 일부 품목 범위 내의 너버 &lt <; = 1 의 경우, (1/i + 1, 1/i] i = 4, BL 지역으로 압축됨 Ri 가 있다. 이후 지속적으로 위에서 아래로 너버 BL 찻입 스페이스 오른쪽에 있는 UD 는 스트립, 포장, & # 장점 = 1 이 먼저 대한 항목을 Rj, & # 183, & # 183, 183 j (순서대로), 4 위에서 아래로. 그런 공간이 없을 경우, 리) 에 의해 항목이 압축됨 bl. 마지막으로, 많아야 1/5 는 R1, & # 항목에서와 크기의 공간에 대한 183, & # 압축됨 183, & # 183. (일반화) 에 의해, R4 노프도 알고리즘입니다. 다시 공간이 없을 경우, 이들 지역에 대한 항목이 압축됨 노프도 R5 사용. 근사화를 비율: UD (I) = (5/4) & # 183 <; OPT 는 최대 높이 H, 여기에서 "H" (I) + (53/8) 항목의. 점근 바인딩될 않아 촉박한 5/4) 이 있다.

  6. 알고리즘입니다 역동기화 충족합니다 (rf) 또한 너비입니다 정상화되면 스트립 및 고주파 (rf) 는 항목에서와 도왔으매 스트립 번호장치 너비입니다. 모든 1 보다 큰 폭의 항목에서와 고주파 (rf) 과 1/2. 나머지 항목은 비사양 원거리일수록 정렬할지 h0 에 의해 그 위에 높이 높이 및 적립율은 압축됨 도달했음 1/2 보다. 그 후 고주파 (rf) 는 다음과 같은 절차를 반복. 대략, 말하기, 고주파 (rf) 은 왼쪽에서 오른쪽으로 항목에서와 선을 따라 더 이상 없을 때까지 h0 바닥 높이를 앞세워 방이요. 그럼 팩 항목에서와 오른쪽에서 왼쪽으로, 위에서 아래로 (일명 역동기화 수준) 까지 총 폭은 최소 1/2. 그 때까지 다운되어도 역동기화 수준 드롭될 (최소한) 그 중 일부 항목을 담고 있습니다. 이 가 어떤 드롭다운하십시오 하다. 근사화를 비율: # &Lt rf (I), (I) = 2& 183, OPT.
  7. 39 의 알고리즘입니다 steinberg&

    39 M, s 로, 이 논문에서, 추정 steinberg& 알고리즘입니다 충족되었으며 상한선 등 모든 것이 있다는 것을 입증하는 데 필요한 높이의 H 팩과도 항목을 입력 항목을 볼 수 있습니다 그리고 W 와 h 의 사각형 안에 들어가 너버 정의하십시오 높이 7 절차 (7 개 상태) 에 두 개의 작은 문제를 해결하는 수준들과 및 각 분할하려면 재귀적으로. 모든 문제를 다루기 쉬운 것으로 현재까지 7 개 중 하나를 충족합니다 로드하십시오.

    근사화를 비율: # 183;; = m (I) &lt 2& OPT (I).

  8. 충족합니다 분할합니다. 알고리즘입니다 (sf) SF, L1 과 L2 너버 1/2 이상 많아야 두 그룹으로 함께 항목에서와 분할합니다 1/2. L1 첫 압축됨 페드 의해 모든 항목이 있다. 그들은 모든 품목이 있는 2/3 이상의 배열됩니다 도왔으매 너버 2/3 정도가 너버 아래와 같습니다. 사각형 R 의 공간이 너버 1/3 이 만듭니다. 나머지 항목은 다음 그 위에 있는 L1 과 L2 는 압축됨 읽기 위해 공간을 사용하여 압축됨 페드. R 이 만든 포장 아래 위에 만들어진 것으로 간주됩니다 수준을 L1. 근사화를 비율: SF (I) = (3/2) & # &lt, 183, OPT (I) + 2. 이 중 점근 바인딩될 3/2 은 막상막하.
  9. 39 의 알고리즘입니다 sleator&

    39 의 알고리즘입니다 sleater& 구성된 4 단계:

  10. 1/2 보다 큰 모든 항목을 너버 압축됨 채널이어야 스트립 회말 위에 있다. 예를 들어, h0 은 높이 위에 h0 결과 포장 이후의 모든 포장 발생합니다.
  11. 나머지 항목은 비사양 원거리일수록 지시한 높이. 일정 수준의 항목은 압축됨 (비사양 원거리일수록 주문하십시오 있는 높이) 의 높이 왼쪽에서 오른쪽으로 선을 따라 h0.
  12. 그 한 가운데에 그려진 세로줄이 잘라냅니다 스트립 agent. 위해 두 개의 동등한 절반 (참고 이 줄 수 있는 항목은 잘라냅니다 압축됨 부분적으로 오른쪽 반단면). 한 두 개의 가로줄 선분 길이의 그릴 반단면, 왼쪽 오른쪽 전체에 걸쳐 한 반단면 (일명 왼쪽 기준선까지의), 다른 하나는 반단면 (오른쪽) 라는 기준선까지의) 등 두 선이 가능한 작게 하는 항목을 금지커서 마십시오.
  13. 왼쪽 또는 오른쪽 기준선까지의 선택할 것을 해당 항목을 절반 수준의 낮은 높이와 팩과도 스트립 보살피되 다음 항목은 너무 큽니다. 낮은 단계 (4) 는 새로운 기준선까지의 구성하고 있는 모든 항목이 압축됨 때까지 기준선까지의 반복됩니다. 시간 복잡도. O (n log n, & # 183). 이 비율은 # 39 의 알고리즘입니다 근사화를 Sleator&) 의 2.5 원하는거요 막상막하.
해설 (3)
해결책

항상 큰 한 첫 번째 단계 솔루션이므로 신속하고 더러운 시작하여, 그 경우 비교 아무것도.

욕심이 커서 조촐하다고 에서 배치

가장 큰 사각형에는 동일팔레트에 나머지 를 압축됨 영역. 이 경우, t fit 어디든요 배치하십시오 can& # 39 곳에 불과한 팩과도 영역을 확장하는 폴링합니다. 함께 마칠 때까지 반복하십시오 가장 작은 직사각형.

39 의 완벽하지 it& http://support. 모두이지만 it& # 39 의 쉽고 좋은 요구한다. 이 문제에 대한 동등한 제공하십시오 여전히 기존 팩과도 완벽하게 들어 있으며, 두 번째 잘 알려져 있다.

해설 (10)

포장 문제]1를 살펴보세요. 2D 빈 포장에 해당되는 것 같습니다. 이 문제와 다른 포장 문제에 대한 해결책을 통해 많은 것을 배울 수 있을 것입니다.

또한 다음을 참조하십시오: 직사각형 이미지 데이터를 정사각형 텍스처로 패킹하기 참조

해설 (2)

이 문제에 대한 광범위한 브로셔등 있습니다. 작은 사각형 영역을 설명하는 좋은 것이 가장 큰 욕심 배치하십시오 에서 사용 가능한 첫 번째 아래쪽의 왼쪽 및 포지셔닝하십시오 컨테이너입니다. 모든 항목 down to the 왼쪽 아래에 중력의 당기는 것 같다. 이 구글 셔젤 왼쪽 하단 packing&quot 대한 설명은 ";).

몇 초 후에 최적화하려면 솔루션, 최신 기술은 20 여 마리의 팩과도 수 있습니다. 후앙 <;;; (http://www.ijcai.org/papers09/Papers/IJCAI09-092.pdf) 에는 a href = &quot &quot &gt algorithm&lt /a>; 찾는 문제를 구분하는 가장 작은 여부를 결정할 문제가 닫기 경계 박스 세트로 특정 크기의 사각형 테두리 상자에 장착할 수 있습니다. 이 프로그램을 제공하기 위해 필요한 최소 경계 사각형, 이 일련의 그들을 에워싼다 확인란 팩과도 알려줍니다.

반복 반복 할 수 있는 가장 작은 단축시킵니다 경우 바깥쪽 경계 기입란 상향 (함께 권력을 이어 폭과 높이를 건수로는 2). 각각의 포장 단축시킵니다 사각형 테두리 상자, 테스트하려면 있는지 찾을 수 있다. A bunch of &quot no&quot, 얻을 수 있습니다. 답변, 첫 번째 &quot 때까지 yes"; 보장받을 수 있는 최적의 솔루션이라는 답이 될 수 있다.

The one that 대한 답변을 통해 알고리즘입니다 내부 루프 &quot yes"; 또는 &quot no"; 경계 상자를 꼭 이래야겠어요 찾아볼 수 있는 구체적인 크기, 그리고 그냥 그의 알고리즘입니다 구현하십시오 후앙 참조. 그는 많은 기능을 포함하고 있지만, 기본적인 사항만 정말 필요한 기본 알고리즘입니다 위에 고기 · 감자여. 이후 순환, 검색, 단순히 운영까지도 처리할 수 있는 동안 두 점 모두 시도하시겠습니까 수명주기의 모든 분기로의 발생할 때 회전 순환 및 백트랙 솔루션이므로 마십시오.

해설 (0)

저는 이것이 NP-어려운 문제라고 확신하기 때문에 최적의 솔루션을 얻으려면 가능한 모든 조합을 시도하는 역추적 알고리즘을 구현해야 합니다.

좋은 소식은 제한된 2D 공간에 2D 직사각형을 채워야 하기 때문에 초기에 많은 가능성을 잘라낼 수 있으므로 그렇게 나쁘지 않을 수 있다는 것입니다.

해설 (6)

What you need is dell. https://github.com/nothings/stb/blob/master/stb_rect_pack.h

예제:

stbrp_context context;

struct stbrp_rect rects[100];

for (int i=0; i< 100; i++)
{
    rects[i].id = i;
    rects[i].w = 100+i;
    rects[i].h = 100+i;
    rects[i].x = 0;
    rects[i].y = 0;
    rects[i].was_packed = 0;
}

int rectsLength = sizeof(rects)/sizeof(rects[0]);

int nodeCount = 4096*2;
struct stbrp_node nodes[nodeCount];

stbrp_init_target(&context, 4096, 4096, nodes, nodeCount);
stbrp_pack_rects(&context, rects, rectsLength);

for (int i=0; i< 100; i++)
{
    printf("rect %i (%hu,%hu) was_packed=%i\n", rects[i].id, rects[i].x, rects[i].y, rects[i].was_packed);
}
해설 (0)

일반적인 해결책은 간단하지 않습니다(수학적으로 완전히 **** 불가능하다는 뜻입니다). 일반적으로 사람들은 유전 알고리즘을 사용하여 가능한 조합을 시도하지만, 가장 큰 모양을 먼저 넣은 다음 다음으로 큰 모양을 다른 위치에 넣는 식으로 시도하면 합리적으로 잘 할 수 있습니다.

해설 (0)

39 m, i& 사용 중.

https://codereview.stackexchange.com/questions/179565/incremental-2d-rectangle-bin-packer = cce6c6101cf349c58423058762fa12b2 뉴어크?

It 는 단두대 알고리즘입니다 입력으로 하며 한 치수이고 하면 다른 최적화합니다 (최대 적은 변화를 코드를 설정할 수도 있습니다). 아마 할 경우 이 두 가지 서로 다른 값을 사용할 수 있습니다.

아니다, 그러나 그것은 어떤 식으로든 최적이고 소형 이동식 (.h 어레이만), 계시한하나님께 이외의 다른 어떤 상관 관계 및 C++ STL.

해설 (0)