3

我正在使用一种称为NEAT的神经网络技术开发回合制游戏 AI 。我正在尝试训练一个可以在二维(X&Y 坐标)空间中移动的网络,给定存储在有效二维数组中的各种值。

我可以看到使用神经网络的两种策略:

  1. 对于网格中的每个“单元”,提供来自不同启发式的分数作为神经元的输入,并创建一个实际上是一个非常复杂的“评分”系统的 NN。将非游戏角色 (NPC) 移动到得分最高的位置。

  2. 为每个启发式度量创建一个压缩值(以某种方式压缩为尽可能少的位),并为每个度量提供一个输入神经元。

我对选项二很感兴趣,因为它提供了最少的计算量(游戏的运行时间很长),但是我很困惑我可以使用什么方法来创建两者的“小表示”版本-维度启发式值。我知道那里有诸如傅立叶变换之类的技术,但是我不知道这些是否适合我的问题。基本上,我正在寻找一种将 50x50 的双精度数组转换为一个或两个双精度值的方法。这两个双精度值可以进行有损压缩,我不需要能够取回原始值,我只需要一个合理的机制来将输入数据更改为一个小的占用空间。

这两种可能性的替代方法是根据与 NPC 的距离以某种方式编码“区域”(因此您可以获得“接近”单元格的实际值和“远”单元格的近似值)。我不确切知道我将如何连接它,但它至少消除了在游戏的每一轮评估每个单元的需要(考虑到我正在以每轮大约 1 秒的速度查看大约 500 万轮,任何简化我能想出会大有帮助)。

如果这没有多大意义,我深表歉意,这是一个相当困难的问题,困扰了我一段时间,我想不出一个简单的方法来描述它。

谢谢,

艾丹

编辑添加(并更改标题):

多亏了克里斯,我们完善了我正在寻找的东西。我正在寻找的是一种以尽可能少的参数逼近一条线的方法(我可以将 2D 地图转换为一条线)。我之前使用三次样条进行插值,但是对于在 0.0 和 1.0 之间变化很大的数据集,我需要一些更可行的东西。我想我正在寻找的是地图的“散列”。

我知道有诸如三次样条之类的技术,我可以从中计算出一些“关键点”,这些值是我正在寻找的合理类比。我需要一种方法来获取 2500 个值并提出这些值的小表示,我可以将其用于神经网络。我认为可以训练NN来推断这些表示的真实含义,或者至少可以确定表示与现实世界之间的某种相关性,因此它不一定需要是可逆函数,但我不认为许多单向函数(例如 MD5、SHA)实际上也会非常有帮助......

4

2 回答 2

2

基本上,任何图形压缩算法都会做你想做的事。它们经过大量优化,可将二维数字数组压缩到尽可能小的空间中。

编辑添加:

要考虑的另一件事是,由于您希望使用压缩来减少处理时间,因此获得真正高的压缩比通常需要更多的计算来压缩和解压缩数组。您可能会花费更多时间来压缩和解压缩数组,而不是运行神经网络。

再次编辑添加:

根据您的评论,听起来您可能想要的是一条空间填充曲线。使用曲线将 50x50* 数组转换为 1x2500 线,然后为数组的每个单元格得出一个近似值的公式。

*阵列必须是 50x50 吗?如果它是一个尺寸略有不同的正方形,则使用空间填充曲线填充可能会容易得多。例如,希尔伯特曲线非常适用于二维的幂次方。

于 2009-04-12T14:59:57.177 回答
1

您可以尝试的一件事是对一维线进行 FFT,然后删除以后的(高频)项。例如,在 MATLAB 中,我执行了以下操作:

x = [1:1000];
y = rand(1,1000);
f = fft(y, 250); % truncate to 250 terms
plot(x,y, x,abs(ifft(f), 1000));

倾向于发生的是 f 的 iFFT 的峰值非常接近 y 的峰值。它们不一定是 y 的最高点,但它们是峰值。例如,本次运行,f 的反 FFT 在 x=424、475 和 725 处有峰值,在 x=423、475 和 726 处也有 y 处的峰值。然而,y 的全局最大值在 x =503,这是ifft(f)中的一个峰值,但不是很高。

但是,这只会真正将您的数据使用量减少一半,因为我将 1000 个双精度值转换为 250 个复数值。仅使用 FFT 的实部可以获得进一步的增加:

x = [1:1000];
y = rand(1,1000);
f = real(fft(y, 250)); % only uses 1/4 the space now
plot(x,y, x,abs(ifft(f, 1000)));

这仍然产生了很好的结果,ifft(f) 的每个主要峰值对应于 y 中的一个峰值,大多数时间最多只有 2 的距离,并且您使用 1/4 直接存储双精度的空间.

但是,这仍然没有得到“一两个双值”的结果。您现在将 2500 个双精度数打包成 625。您可以通过删减更多项进行试验,但您必须通过删减更多项来“近距离”测试更多值。也许你可以保留前 10% 的项,找到最大值,然后在 3 或 4 的距离内查看;这会将您的 2500 双打减少到“仅” 250。只有测试才能找出最适合您的应用程序的方法。

如果你真的很绝望,你可以低至最低的 1% 频率,并在任一方向搜索 5 或 6 以寻找真正的峰值。但这仍然给你留下了 25 个双打。

我不认为有任何方法可以将 2500 个双打转换为只有 1 个或 2 个,并且可以将其转换为任何有意义的东西。看看信息论课本,看看为什么。我建议您使用 MATLAB、GNU Octave 甚至 Excel,并尝试使用类似的东西并找到最适合您的结果。

于 2009-04-12T18:10:29.777 回答