我有20
个文件系统:
/fs01
/fs02
/fs03
...
/fs20
在我的Unix环境中。这些文件系统中的每一个都包含一些可用空间,我可以使用它来保存文件。这些文件系统彼此独立,每个文件系统包含不同数量的可用空间。
我在另一台主机上有100
个不同大小的文件,我想将这些文件放在任何可用的位置。显然,在将文件放在特定文件系统上之后,该特定文件系统上的可用空间量将减少文件大小。
我正在寻找一种有效的方法;即一种算法,它将上述数据作为输入,并给我一个映射,如:
/fs01 <- f1,f10,f29
/fs02 <- f5,f30
/fs03 <-nothing here. too small.
...
/fs20 <- f89,f100
其中f1
为file 1
,f2
为file 2
等。
你认为是否有这样的算法?
答案 0 :(得分:3)
在我看来,你可以使用整数编程技术解决它。
https://en.wikipedia.org/wiki/Integer_programming
那里有很多免费解决方案。
模型很简单。您有20x100个变量,可以是0或1.每个变量x_ {i,j}表示(0:文件不在此文件系统中,1:此文件系统中的文件)。 约束是:
soluzione空间中的每个点都可以。
答案 1 :(得分:0)
在很高的水平上,这肯定是一种可能性。乍一看并忽略了排序性能,主要操作将以二次方式运行。
此处的目标是将最大的文件与具有足够空间的文件系统相匹配。这不会确保所有文件都收到展示位置。
files = [file1, file2, file3, ...] # array of files
fs = [fs1, fs2, fs3, ...] # array of file systems
files.sort() # sort by size descending
fs.sort() # sort by free space ascending
for (i = 0; i < files.length; i++) {
for (j = 0; j < fs.length; j++) {
if (files[i].size <= fs[j].freespace) { # if the filesystem has space for the file
files[i].move(fs[j]) # move the file to the filesystem
fs[j].freespace -= files[i].size # reduce free space by file size
}
}
}
这是因为问题的关键是优化问题。以上只是强制解决方案,因为它不会尝试优化文件放置以最大限度地利用空间。
此外,上述内容并不适用于所有情况:
工作案例 - FS1,FS4,FS6:F5,F2,F1(F5 - > FS6,F2 - > FS4,F1 - > FS1)
失败案例 - FS6,FS8:F5,F4,F3,F2(F5 =&gt; FS6,F4 =&gt; FS8,F3 =&gt; FS8,F2是孤儿)
在更大范围内,您的问题将受益于使用hueristics。一种可能性是使用遗传算法生成分布并选择具有最高适应度的分布。
您可以阅读有关遗传算法的更多信息here
可以找到解释如何使用遗传算法的简单教程here