가능한 한 많은 공간을 차지하도록 화면에 (크기 조정 가능) 창을 배열하는 알고리즘을 고안하는 방법은 무엇입니까?


20

창 세트 (너비 + 높이)와 화면 해상도를 수락하고 창에서 공간을 가장 많이 차지하도록 화면에 해당 창 배열을 출력하는 간단한 프로그램을 작성하고 싶습니다. 따라서 output size >= initial size화면비와 화면비 를 유지하면서 창의 크기를 조정할 수 있습니다 . 따라서 창 경우 알고리즘이 튜플 을 반환하고 싶습니다 .( X , Y , d는 마에 H를 , H I g의 시간 t )i(x,y,width,height)

나는 이것이 2D 배낭의 변형 일 것이라고 생각합니다. 웹에서 결과를 살펴 보았지만 대부분 배경이 많았고 구현이 없었기 때문에 따르기가 어려웠습니다.

나는 가장 빠른 알고리즘에 관심이 없지만 특정 요구에 실용적인 것에 더 관심이 있습니다.


1
창 크기를 조정하는 경우 "초기 크기를 유지"하는 것이 아니라 가로 세로 비율 만 유지하는 것입니다.
Emre

1
하나의 창 크기를 조정하여 화면을 덮을 수 있습니다. 문제는 무엇입니까?

2
두 번째 Saeed의 의견입니다. 사소한 솔루션을 제외하려면 크기 조정의 합계를 최소화하는 최소 크기와 같은 추가 제약 조건이 필요합니다. Nota bene : 수학자들은 타일링 문제를 테셀레이션 이라고 부릅니다 .
Raphael

1
말하자면, 볼 수있는 최소 창 영역을 최대화하고 볼 수있는 최대 창 영역을 최소화하고 싶지만 충돌이 허용됩니까? 문제를 수정하여 버그가 없는지 확인하십시오. 현재 문제에 대한 생각은 쉽지 않습니다.

2
WminwWsize(w)W

답변:


9

귀하의 질문에 대답하지는 않지만, 창문이 겹치지 않기를 원한다고 가정합니다.

이 문제에 대한 한 가지 접근 방식은 Choco 와 같은 제약 조건 솔버를 사용하는 것 입니다. 하나는 단순히 문제를 인코딩하는 제약 조건을 기록하고 솔버를 조정하여 현명한 방식으로 행동 한 다음 실행되도록합니다. 즉, 알고리즘을 고안하고 프로그래밍 및 튜닝을 수행하는 것이 아니라 문제를 인코딩하는 좋은 방법을 찾는 데 필요한 모든 생각이 필요합니다. 다음은 시작하기위한 부분 답변입니다.

화면 크기가 합니다.xmax×ymax

각 창 에 대해 변수 및 제약 조건 세트가 있습니다.x i , y i , h i , w iWixi,yi,hi,wi

  • xi,yi,hi,wi0
  • xi+wixmax
  • yi+hiymax
  • 아마도 최소 크기의 창, 예를 들어 같은 일부 제약 조건이있을 수 있습니다.hi100
  • 가로 세로 비율 : 가로 세로 비율이 3 : 4 인 경우 제한은 과 수 있습니다 . 여기서 은 완전하지 않은 오류를 허용하는 0이 아닌 작은 오류 항입니다. 그렇지 않으면 문제를 과도하게 제한하는 창 크기입니다.ϵ4hiϵ3wi4hi+ϵϵ

이제 창 겹침을 처리해야합니다. 각 창 쌍 에 대해 인 경우 다음과 같은 제약 조건을 생성하여 모서리가 내에 않도록 캡처합니다 . 내용 , 제약 생성 : 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 jWi,WjijWjWi(x,y){(xj,yj),(xj+wj,yj),(xj,yj+hj),(xj+wj,yj+hj)}

  • ¬(xixxi+wjyiyyi+hj) .

지금까지 지정된 제약 조건은 화면의 측면에 쏟아지지 않고 일부 최소 크기 제약 조건을 충족하며 가로 세로 비율을 유지하는 겹치지 않는 창만 설명합니다.

잘 맞으려면 좋은 레이아웃이라는 의미를 포착하는 메트릭을 지정해야합니다. 창의 크기를 대략 동일하게 유지하거나 "공백"을 최소화하려는 것으로 가정 할 수 있습니다. 나는 이것이 Choco를 사용하여 지정할 수 있다고 생각하지 않지만 다른 제약 해결으로 가능할 수도 있습니다 (다른 누군가가 여기에서 도울 수 있습니다).

Choco는 단일 변수로 지정된 목적 함수로 wrt를 최대화 할 수 있습니다. 이 아이디어를 바탕으로 다음을 최대화 할 수 있습니다.

  • i(hi+wi)

제약 조건을 작성하고 Choco에게 를 최대화하도록 지시 합니다.c o s tcost=i(hi+wi)cost


이것은 유망한 것처럼 보이며 Choco와 함께 어떻게 작동하는지, 얼마나 빠른지 확실히 알 것입니다.
daniel.jackson 2016

그러나 왜 일반적으로 말합니까? 제약 조건을 선형 불평등으로 표현할 수 있다고 생각합니다. 즉, 바닐라 선형 프로그램이라는 것을 의미합니다.
Suresh

@Suresh : 자세히 설명해주십시오. 나는 방법을 즉시 보지 못한다.
Dave Clarke

1

나는 무차별 대입 솔루션을위한 프로토 타입을 작성하기 시작했다.

먼저, 일부 정의 : 를 모든 창의 집합으로 설정하십시오. 각 윈도우 ( 는 x, y 좌표 및 폭과 높이에 대한 로 구성된다 . 창은 최소 너비와 높이로 초기화됩니다.w x w , y w , w w , h wWwxw,yw,ww,hw

알고리즘의 입력은 너비와 높이 및 창 목록 이있는 화면 입니다.S

그것은 대략 그렇게 작동합니다 :

void fit(W, S, i, n, result)
    if i == n
        if S.score() < result.score()
            result = S
        return

    w = W[i]
    foreach x, y in S.coordinates()
        set w position to (x, y)
        while S.put(w) # check that w doesn't overlap with S's other windows and add it
            fit(W, S, i+1, n, result)
            S.windows.pop()
            w.grow()
        w.restoresize()

몇 가지 개선해야 할 사항이 있습니다.

  • S.coordinates()지금 매우 느립니다. 모든 점을 반복하고 S.width x S.height각 점이 S의 창 중 하나에 있는지 확인합니다.

  • S.put()Dave의 답변에 언급 된 테스트를 수행하여 매개 변수가 나머지 S의 창과 겹치는 지 확인합니다. 간격 트리 를 사용하여 향상시킬 수 있습니까?

  • S.score()현재 는 단순히 모든 창의 영역 인 를 합니다. 더 나은 레이아웃을 생성하려면 다른 변수를 고려해야합니다.wS.windows(hwww)

  • 위 함수 는 최상의 결과를 얻으려면 모든 순열을 시도해야합니다 .W

현재 화면과 창을 나타내는 적절한 데이터 구조를 찾으려고 노력 중이며 다음 쿼리를 지원해야합니다.

  • 주어진 창을 다른 창과 겹치지 않고 위치시킬 수있는 좌표 목록을 반환
  • x, y 위치에 창 삽입 (이미 겹치지 않음)
  • 모든 창문을 반환
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.