가능한 한 가장 작은 공간(이 공간의 크기는 2의 거듭제곱이어야 함)에 넣어야 하는 직사각형 물체가 여러 개 있습니다.
주어진 공간에 가능한 한 물건을 잘 포장하는 다양한 포장 알고리즘을 알고 있지만, 이 경우에는 그 공간이 얼마나 커야 하는지 계산하는 알고리즘이 필요합니다.
예를 들어 다음과 같은 직사각형이 있다고 가정해 보겠습니다.
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의 거듭제곱, 각 치수에 대해 주어진 최대 크기 이내)를 결정할 수 있는 알고리즘에는 어떤 것이 있을까요?
지켜보리니 [이 페이지에서 호 프로젝트] (http://www.csc.liv.ac.uk/ ~ epa/surveyhtml.html) 를 대상으로 조사한 결과, 복잡한 구현 솔루션 사이의 상관 관계를 있습니다 / 시간, 최적성) 이 있는데, 다양한 알고리즘을 선택할 수 있습니다.
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. 기본적으로, 일부 품목 범위 내의 너버 < <; = 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) 이 있다.
근사화를 비율: # 183;; = m (I) < 2& OPT (I).
항상 큰 한 첫 번째 단계 솔루션이므로 신속하고 더러운 시작하여, 그 경우 비교 아무것도.
욕심이 커서 조촐하다고 에서 배치
가장 큰 사각형에는 동일팔레트에 나머지 를 압축됨 영역. 이 경우, t fit 어디든요 배치하십시오 can& # 39 곳에 불과한 팩과도 영역을 확장하는 폴링합니다. 함께 마칠 때까지 반복하십시오 가장 작은 직사각형.
포장 문제]1를 살펴보세요. 2D 빈 포장에 해당되는 것 같습니다. 이 문제와 다른 포장 문제에 대한 해결책을 통해 많은 것을 배울 수 있을 것입니다.
또한 다음을 참조하십시오: 직사각형 이미지 데이터를 정사각형 텍스처로 패킹하기 참조
이 문제에 대한 광범위한 브로셔등 있습니다. 작은 사각형 영역을 설명하는 좋은 것이 가장 큰 욕심 배치하십시오 에서 사용 가능한 첫 번째 아래쪽의 왼쪽 및 포지셔닝하십시오 컨테이너입니다. 모든 항목 down to the 왼쪽 아래에 중력의 당기는 것 같다. 이 구글 셔젤 왼쪽 하단 packing" 대한 설명은 ";).
몇 초 후에 최적화하려면 솔루션, 최신 기술은 20 여 마리의 팩과도 수 있습니다. 후앙 <;;; (http://www.ijcai.org/papers09/Papers/IJCAI09-092.pdf) 에는 a href = " " > algorithm< /a>; 찾는 문제를 구분하는 가장 작은 여부를 결정할 문제가 닫기 경계 박스 세트로 특정 크기의 사각형 테두리 상자에 장착할 수 있습니다. 이 프로그램을 제공하기 위해 필요한 최소 경계 사각형, 이 일련의 그들을 에워싼다 확인란 팩과도 알려줍니다.
반복 반복 할 수 있는 가장 작은 단축시킵니다 경우 바깥쪽 경계 기입란 상향 (함께 권력을 이어 폭과 높이를 건수로는 2). 각각의 포장 단축시킵니다 사각형 테두리 상자, 테스트하려면 있는지 찾을 수 있다. A bunch of " no", 얻을 수 있습니다. 답변, 첫 번째 " 때까지 yes"; 보장받을 수 있는 최적의 솔루션이라는 답이 될 수 있다.
The one that 대한 답변을 통해 알고리즘입니다 내부 루프 " yes"; 또는 " no"; 경계 상자를 꼭 이래야겠어요 찾아볼 수 있는 구체적인 크기, 그리고 그냥 그의 알고리즘입니다 구현하십시오 후앙 참조. 그는 많은 기능을 포함하고 있지만, 기본적인 사항만 정말 필요한 기본 알고리즘입니다 위에 고기 · 감자여. 이후 순환, 검색, 단순히 운영까지도 처리할 수 있는 동안 두 점 모두 시도하시겠습니까 수명주기의 모든 분기로의 발생할 때 회전 순환 및 백트랙 솔루션이므로 마십시오.
저는 이것이 NP-어려운 문제라고 확신하기 때문에 최적의 솔루션을 얻으려면 가능한 모든 조합을 시도하는 역추적 알고리즘을 구현해야 합니다.
좋은 소식은 제한된 2D 공간에 2D 직사각형을 채워야 하기 때문에 초기에 많은 가능성을 잘라낼 수 있으므로 그렇게 나쁘지 않을 수 있다는 것입니다.
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);
}
일반적인 해결책은 간단하지 않습니다(수학적으로 완전히 **** 불가능하다는 뜻입니다). 일반적으로 사람들은 유전 알고리즘을 사용하여 가능한 조합을 시도하지만, 가장 큰 모양을 먼저 넣은 다음 다음으로 큰 모양을 다른 위치에 넣는 식으로 시도하면 합리적으로 잘 할 수 있습니다.
https://codereview.stackexchange.com/questions/179565/incremental-2d-rectangle-bin-packer = cce6c6101cf349c58423058762fa12b2 뉴어크?
It 는 단두대 알고리즘입니다 입력으로 하며 한 치수이고 하면 다른 최적화합니다 (최대 적은 변화를 코드를 설정할 수도 있습니다). 아마 할 경우 이 두 가지 서로 다른 값을 사용할 수 있습니다.
아니다, 그러나 그것은 어떤 식으로든 최적이고 소형 이동식 (.h 어레이만), 계시한하나님께 이외의 다른 어떤 상관 관계 및 C++ STL.