我想编写一个简单的程序,该程序接受一组窗口(宽度+高度)和屏幕分辨率,并在屏幕上输出这些窗口的排列,以使窗口占用最大的空间。因此,可以在保持output size >= initial size
纵横比的同时调整窗口的大小 。所以对于窗口,我希望该算法返回一个元组。
我相信这可能是2D背包的变形。我曾尝试遍历整个网络的结果,但是它们大多数都有很多背景(并且没有实现),这使我难以理解。
我对最快的算法不太感兴趣,但对满足我的特定需求的实用工具却更感兴趣。
我想编写一个简单的程序,该程序接受一组窗口(宽度+高度)和屏幕分辨率,并在屏幕上输出这些窗口的排列,以使窗口占用最大的空间。因此,可以在保持output size >= initial size
纵横比的同时调整窗口的大小 。所以对于窗口,我希望该算法返回一个元组。
我相信这可能是2D背包的变形。我曾尝试遍历整个网络的结果,但是它们大多数都有很多背景(并且没有实现),这使我难以理解。
我对最快的算法不太感兴趣,但对满足我的特定需求的实用工具却更感兴趣。
Answers:
尽管您的问题并未说明,但我假设您不希望窗口重叠。
解决此问题的一种方法是使用约束求解器,例如Choco。只需简单地写下编码问题的约束条件,调整求解器以一种明智的方式运行,然后使其运行即可。这意味着您需要做的所有思考都将用于寻找编码问题的好方法,而不是设计算法以及进行编程和调整。这是部分答案,可以帮助您入门。
假设屏幕尺寸为 x。
对于每个窗口,您将拥有一组变量和约束X 我,ÿ 我,ħ 我,瓦特我
现在,您需要注意窗口重叠。对于每对窗口,其中,您将生成如下约束,该约束捕获中没有出现。对于,生成约束: 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
到目前为止指定的约束条件仅描述了不重叠的窗口,这些窗口不溢出屏幕的侧面,满足一些最小的尺寸约束,并保留其长宽比。
为了获得良好的匹配度,您需要指定一个指标,以反映出良好布局的含义。一种可能性是假设您要使窗口大小大致相等和/或要最小化“空白”。我不认为可以使用Choco来指定它,但是可以通过其他约束解决方案来解决(其他人可以在这里提供帮助)。
Choco确实允许最大化最大化指定为单个变量的目标函数。基于此想法,您可以最大化以下内容:
通过编写约束并告诉Choco最大化。c o s t
我开始编写蛮力解决方案的原型,希望可以对其进行优化以使其实用。
首先,一些定义:令为所有窗口的集合。每个窗口由x,y坐标以及宽度和高度的组成。用最小的宽度和高度初始化窗口。瓦特X 瓦特,ÿ 瓦特,瓦特瓦特,ħ 瓦特
该算法的输入是屏幕,它具有宽度和高度以及窗口列表。
它大致如此工作:
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()
当前返回,这只是所有窗口的面积。它需要考虑其他变量以产生更好的布局。
上面的函数需要尝试所有排列以获得最佳结果。
我目前正在尝试找出一种合适的数据结构来表示屏幕及其窗口,它需要支持以下查询: