귀하의 질문에 대답하지는 않지만, 창문이 겹치지 않기를 원한다고 가정합니다.
이 문제에 대한 한 가지 접근 방식은 Choco 와 같은 제약 조건 솔버를 사용하는 것 입니다. 하나는 단순히 문제를 인코딩하는 제약 조건을 기록하고 솔버를 조정하여 현명한 방식으로 행동 한 다음 실행되도록합니다. 즉, 알고리즘을 고안하고 프로그래밍 및 튜닝을 수행하는 것이 아니라 문제를 인코딩하는 좋은 방법을 찾는 데 필요한 모든 생각이 필요합니다. 다음은 시작하기위한 부분 답변입니다.
화면 크기가 합니다.엑스해요 X를× y해요 X를
각 창 에 대해 변수 및 제약 조건 세트가 있습니다.x i , y i , h i , w i여나는엑스나는, y나는, h나는, w나는
- 엑스나는, y나는, h나는, w나는≥ 0
- 엑스나는+ 승나는≤ x해요 X를
- 와이나는+ 시간나는≤ y해요 X를
- 아마도 최소 크기의 창, 예를 들어 같은 일부 제약 조건이있을 수 있습니다.h나는100 이상
- 가로 세로 비율 : 가로 세로 비율이 3 : 4 인 경우 제한은 과 수 있습니다 . 여기서 은 완전하지 않은 오류를 허용하는 0이 아닌 작은 오류 항입니다. 그렇지 않으면 문제를 과도하게 제한하는 창 크기입니다.ϵ4 시간나는- ε ≤ 3 w나는≤ 4 시간나는+ ϵϵ
이제 창 겹침을 처리해야합니다. 각 창 쌍 에 대해 인 경우 다음과 같은 제약 조건을 생성하여 모서리가 내에 않도록 캡처합니다 . 내용 , 제약 생성 : i ≠ j W j W i ( x , y ) ∈ { ( x j , y j ) , ( x j + w j , y j ) , ( x j , y j + h j ) , ( x j + w j , y j + h j여나는, Wj나는 ≠ j여j여나는( x , y) ∈ { ( xj, yj) , ( xj+ 승j, yj) , ( xj, yj+ 시간j) , ( xj+ 승j, yj+ 시간j) }
- ¬ ( x나는≤ x ≤ x나는+ 승j∧ y나는≤ y≤ y나는+ 시간j) .
지금까지 지정된 제약 조건은 화면의 측면에 쏟아지지 않고 일부 최소 크기 제약 조건을 충족하며 가로 세로 비율을 유지하는 겹치지 않는 창만 설명합니다.
잘 맞으려면 좋은 레이아웃이라는 의미를 포착하는 메트릭을 지정해야합니다. 창의 크기를 대략 동일하게 유지하거나 "공백"을 최소화하려는 것으로 가정 할 수 있습니다. 나는 이것이 Choco를 사용하여 지정할 수 있다고 생각하지 않지만 다른 제약 해결으로 가능할 수도 있습니다 (다른 누군가가 여기에서 도울 수 있습니다).
Choco는 단일 변수로 지정된 목적 함수로 wrt를 최대화 할 수 있습니다. 이 아이디어를 바탕으로 다음을 최대화 할 수 있습니다.
제약 조건을 작성하고 Choco에게 를 최대화하도록 지시 합니다.c o s tc o s t = ∑나는( 시간나는+ 승나는)c o s t