Хоча ваше запитання не говорить про це, я припускаю, що ви не хочете, щоб вікна перекривались.
Один із підходів до цієї проблеми - використовувати вирішувач обмежень, такий як Choco . Один просто записує обмеження, що кодують вашу проблему, налаштовує вирішувач на розумний спосіб, а потім нехай він працює. Це означає, що все мислення, що вам потрібно зробити, буде витрачено на пошук хорошого способу кодування проблеми, а не на розробку алгоритму та на програмування та налаштування. Ось часткова відповідь, щоб розпочати роботу.
Припустимо, що розмір екрана становить .xmax×ymax
Для кожного вікна, , ви будете мати набір змінних та обмеженьx i , y i , h i , w iWixi,yi,hi,wi
- xi,yi,hi,wi≥0
- xi+wi≤xmax
- yi+hi≤ymax
- Можливо також деякі обмеження щодо мінімального розміру вікон, наприклад, тощо.hi≥100
- Обмеження в аспекті: якщо співвідношення сторін дорівнює 3: 4, обмеження може бути чимось на зразок , де - деякий невеликий ненульовий термін помилки, щоб дозволити недосконалий розміри вікон, оскільки в іншому випадку ви перестанете обмежувати проблему.ϵ4hi−ϵ≤3wi≤4hi+ϵϵ
Тепер потрібно подбати про перекриття вікон. Для кожної пари вікон, , де , ви генеруватимете такі обмеження, як наступні, які фіксують, що жоден кут відображається в межах . Для , створюють обмеження:Wi,WjW j W i ( x , y ) ∈ { ( x j ,i≠jWjWi(x,y)∈{(xj,yj),(xj+wj,yj),(xj,yj+hj),(xj+wj,yj+hj)}
- ¬(xi≤x≤xi+wj∧yi≤y≤yi+hj) .
Наразі обмеження, описані лише, описують вікна, що не перекриваються, які не розтікаються по сторонах екрана, які задовольняють деяким обмеженням мінімального розміру та зберігають їх співвідношення сторін.
Для того, щоб отримати гарну форму, вам потрібно вказати показник, який фіксує, що означає хороший макет. Однією з можливостей є припущення, що ви хочете, щоб вікна були приблизно однаковими за розмірами та / або що ви хочете мінімізувати "пробіл". Я не думаю, що це можна вказати за допомогою Choco, але це можливо з іншим рішенням обмежень (тут може допомогти хтось інший).
Choco дійсно дозволяє максимізувати wrt до цільової функції, визначеної як одна змінна. Виходячи з цієї ідеї, ви можете досягти максимального наступного:
написавши обмеження і сказавши Чоко, щоб максимізувати .c o s tcost=∑i(hi+wi)cost