5

我想为人工智能创造一个行星大小的环境。它将模拟一个非常大的世界的地下生活。根据维基百科,地球的表面积为 510,072,000 Km^2,我想创建一个相似比例的正方形,也许更大。我将在每个位上存储一米,其中 0 表示污垢,1 表示污垢墙。

我们先计算一下如何存储这个正方形的单行。一条线是510072000000m,每个字节可以存储8米,所以一条线是59.38GB,整个世界是3.44PB。而且我想在每平方米中至少添加水和熔岩,这将使结果乘以 2。

我需要使用无损数据压缩算法压缩这些信息。我首先使用 7zip 尝试了一种非常直接的方法,然后我尝试了一个较小的世界,其中一行是 6375B。理论上世界应该是6375^2B = 38.76MB,但是当我尝试它时我得到一个155MB的文件,我不知道为什么会有这种差异。但是当我用 7Zip 压缩它时,我得到一个 40.1MB 的文件。这是一个巨大的差异,按照这个比例,我会将 3.44PB 的世界文件转换为 912.21GB 的文件。

我的第一个想法是,为什么我有这么大的文件,而数学告诉我它应该更小?也许问题是代码,也许问题是我在数学上有错误。代码如下:(C#)

// 510072000000m each line = 63759000000B
const long SIZE = 6375;

// Create the new, empty data file.
string fileName = tbFile.Text;

FileStream fs = new FileStream(fileName, FileMode.Create);

// Create the writer for data.
BinaryWriter w = new BinaryWriter(fs);

// Use random numbers to fill the data
Random random = new Random();
// Write data to the file.
for (int i = 0; i < SIZE; i++)
{
    for (int j = 0; j < SIZE; j++)
    {
        w.Write(random.Next(0,256));
    }
}

w.Close();

fs.Close();

数学是如此基础,以至于如果我做错了什么,我就看不到它。

你能给我什么建议吗?只关注数据压缩,人工智能不是问题,因为我有进化算法的经验,世界不需要是实时的,它可以占用它需要的所有时间。

谢谢大家的时间。

4

2 回答 2

3

我不知道C#,但似乎您当前每次写入 4 个字节(6375 * 6375 * 4 字节,MB = 155 MB)。所以我猜想 Write 方法当前写入一个 32 位整数。

于 2012-07-06T10:02:17.827 回答
2

@Scharron 已正确回答了您问题的具体细节,但我认为还有一个更根本的问题:

理论上不可能显着压缩随机数据。事实上,当给定随机输入数据时,大多数压缩算法都会增加存储大小。也许您的 AI 算法的细节会引入一些无法压缩的模式,但如果您从真正随机的输入数据开始,您将不得不存储这些多个 PB。

您看到显着压缩的原因是,正如@Scharron 指出的那样,您为每个数据字节写入 3 个零字节,从而产生更容易压缩的数据。

于 2012-07-06T10:11:17.290 回答