如何在20个文件系统上放置100个不同的文件?

时间:2015-06-17 16:25:36

标签: algorithm

我有20个文件系统:

 /fs01
 /fs02
 /fs03
 ...
 /fs20

在我的Unix环境中。这些文件系统中的每一个都包含一些可用空间,我可以使用它来保存文件。这些文件系统彼此独立,每个文件系统包含不同数量的可用空间。

我在另一台主机上有100个不同大小的文件,我想将这些文件放在任何可用的位置。显然,在将文件放在特定文件系统上之后,该特定文件系统上的可用空间量将减少文件大小。

我正在寻找一种有效的方法;即一种算法,它将上述数据作为输入,并给我一个映射,如:

 /fs01    <- f1,f10,f29
 /fs02    <- f5,f30
 /fs03    <-nothing here. too small.
 ...
 /fs20    <- f89,f100

其中f1file 1f2file 2等。 你认为是否有这样的算法?

2 个答案:

答案 0 :(得分:3)

在我看来,你可以使用整数编程技术解决它。

https://en.wikipedia.org/wiki/Integer_programming

那里有很多免费解决方案。

模型很简单。您有20x100个变量,可以是0或1.每个变量x_ {i,j}表示(0:文件不在此文件系统中,1:此文件系统中的文件)。 约束是:

  • 每个变量介于0和1之间(整数为0或1)
  • 与文件相关的所有变量的总和为1(每个文件仅在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