あなたの質問はそれを言っていませんが、私はあなたがウィンドウをオーバーラップさせたくないと仮定しています。
この問題に対する1つのアプローチは、Chocoなどの制約ソルバーを使用することです。問題をエンコードする制約を書き留め、ソルバーをスマートな方法で動作するように調整し、実行させます。これは、アルゴリズムを考案したりプログラミングやチューニングを行うのではなく、問題をエンコードする良い方法を見つけることにあなたがする必要があるすべての思考が費やされることを意味します。開始するための部分的な回答を次に示します。
画面サイズがと仮定します。バツmは、Xが× ymは、Xが
各ウィンドウについて、、あなたは変数のセットがありますX I、Y I、H I、W Iと制約をW私バツ私、y私、h私、w私
- バツ私、y私、h私、w私≥ 0
- バツ私+ w私≤ Xmは、Xが
- y私+ h私≤ yのmは、Xが
- おそらく、また、例えば、ウィンドウの最小サイズ、上のいくつかの制約など。h私≥ 100
- アスペクト比が3である場合:アスペクト制約4、制約のようなものとすることができる、εは、不完全なウィンドウを可能にするためにいくつかの小さな非ゼロの誤差項でありますそれ以外の場合は、問題を過度に制約します。4 時間私- ε ≤ 3 wの私≤ 4 時間私+ ϵϵ
ここで、ウィンドウのオーバーラップに注意する必要があります。ウィンドウの各ペア、(i ≠ j)に対して、次のような制約を生成します。これは、W i内にW jのコーナーが表示されないことをキャプチャします。以下のための(X 、Y )∈ { (XのJ、Y J)、(X J + W J、Y J)、(XのJ、YW私、Wji ≠ jWjW私、制約を生成します:(x 、y)∈ { (xj、yj)、(xj+ wj、yj)、(xj、yj+ hj)、(xj+ wj、yj+ hj)}
- 。¬ (x私≤ X ≤ X私+ wj∧ Y私≤ yの≤ yの私+ hj)
これまでに指定された制約は、画面の端からはみ出ず、いくつかの最小サイズの制約を満たし、アスペクト比を維持する、重なり合わないウィンドウのみを説明します。
適切にフィットさせるには、適切なレイアウトであることの意味を把握するメトリックを指定する必要があります。1つの可能性は、ウィンドウのサイズをほぼ同じにしたい、および/または「空白」を最小限に抑えたいと仮定することです。これはChocoを使用して指定できるとは思いませんが、別の制約解決で可能になる可能性があります(他の誰かがここで助けてくれるかもしれません)。
Chocoでは、単一の変数として指定された目的関数に対してwrtを最大化できます。この考えに基づいて、次を最大化できます。
制約書き込むことにより、及び最大化するためにチョコを伝えるC 、O 、S 、T。c o s t = ∑私(h私+ w私)C O S T