Chociaż twoje pytanie tego nie mówi, zakładam, że nie chcesz, aby okna nakładały się na siebie.
Jednym podejściem do tego problemu jest użycie solvera ograniczającego, takiego jak Choco . Wystarczy zapisać ograniczenia kodujące problem, dostroić solver do działania w sprytny sposób, a następnie pozwolić mu działać. Oznacza to, że całe myślenie, które musisz zrobić, zostanie poświęcone na znalezienie dobrego sposobu na zakodowanie problemu, a nie na opracowanie algorytmu oraz wykonanie programowania i strojenia. Oto częściowa odpowiedź na początek.
Załóżmy, że rozmiar ekranu to . .xmax×ymax
Dla każdego okna, , będziesz mieć zestaw zmiennych i ograniczeniaWixi,yi,hi,wi
- xi,yi,hi,wi≥0
- xi+wi≤xmax
- yi+hi≤ymax
- Być może także pewne ograniczenia dotyczące minimalnego rozmiaru okien, np. i tak dalej.hi≥100
- Ograniczenia aspektu: Jeśli współczynnik proporcji wynosi 3: 4, ograniczenie może być takie jak , gdzie jest małym niezerowym terminem błędu, który pozwala na rozmiary okien, ponieważ w innym przypadku nadmiernie ograniczysz problem.4hi−ϵ≤3wi≤4hi+ϵϵ
Teraz musisz zadbać o nakładanie się okien. Dla każdej pary okien, , gdzie , wygenerujesz ograniczenia takie jak poniżej, które wychwytują, że żaden narożnik pojawia się w . Dla , wygeneruj ograniczenie:Wi,Wji≠jWjWi(x,y)∈{(xj,yj),(xj+wj,yj),(xj,yj+hj),(xj+wj,yj+hj)}
- ¬(xi≤x≤xi+wj∧yi≤y≤yi+hj) .
Ograniczenia określone do tej pory opisują tylko okna, które nie zachodzą na siebie, ale nie rozlewają się po bokach ekranu, spełniają pewne ograniczenia dotyczące minimalnego rozmiaru i zachowują proporcje.
Aby uzyskać dobre dopasowanie, musisz określić metrykę, która uchwyci, co to znaczy być dobrym układem. Jedną z możliwości jest założenie, że chcesz, aby okna były mniej więcej równe pod względem wielkości i / lub że chcesz zminimalizować „białe znaki”. Nie sądzę, że można to określić za pomocą Choco, ale może to być możliwe przy innym rozwiązaniu ograniczeń (ktoś inny może tu pomóc).
Choco pozwala zmaksymalizować wrt do funkcji celu określonej jako pojedyncza zmienna. W oparciu o ten pomysł można zmaksymalizować następujące elementy:
pisząc ograniczenie i informując Choco o maksymalizacji .cost=∑i(hi+wi)cost