Artificial intelligence 以最少的“";参数“;尽可能

Artificial intelligence 以最少的“";参数“;尽可能,artificial-intelligence,neural-network,game-ai,neat,Artificial Intelligence,Neural Network,Game Ai,Neat,我正在开发一款基于回合的游戏AI,它使用了一种被称为的神经网络技术。我正在尝试训练一个网络,它可以在二维(X&Y坐标)空间中移动,给定存储在二维数组中的各种值 我可以看到使用神经网络的两种策略: 对于网格中的每个“单元”,提供来自不同启发式的分数作为神经元的输入,并创建一个神经网络,它实际上是一个非常复杂的“评分”系统。将非玩家角色(NPC)移动到得分最高的位置 为每个heuristic度量值创建一个压缩值(以某种方式压缩为尽可能少的位),并为每个度量值提供一个输入神经元 我对选项二很感兴趣,因

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

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

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

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

  • 我对选项二很感兴趣,因为它提供了所需的最少计算量(游戏的运行时间相当长),但是我不知道我可以使用什么方法来创建二维海利主义值的“小表示”版本。我知道有一些技术,比如傅里叶变换,但是我不知道这些是否适合我的问题。基本上,我正在寻找一种方法,将50x50的double数组转换为一个或两个double值。这两个双值可以进行有损压缩,我不需要恢复原始值,我只需要一个合理的机制将输入数据更改为一个小的占用空间

    这两种可能性的一种替代方法是,基于与NPC的距离对“区域”进行编码(因此,可以得到“近”单元的实际值,以及“远”单元的近似值)。我不知道该如何将其连接起来,但它至少消除了在游戏的每一回合评估每个单元格的需要(考虑到我在每轮大约1秒的时间内查看大约500万个回合,我能想到的任何简化都会大有帮助)

    如果这没有多大意义,我很抱歉,这是一个困扰我一段时间的难题,我想不出一个简单的方法来描述它

    谢谢,

    艾丹

    编辑以添加(和更改标题):

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


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

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

    编辑以添加:

    另一件要考虑的事情,因为你想使用压缩来减少处理时间,所以得到很高的压缩比通常需要更多的计算来压缩和解压缩数组。与运行神经网络相比,您可能需要花费更多的时间压缩和解压缩数组

    再次编辑以添加:

    根据你的评论,听起来你可能想要的是一份工作。使用该曲线将50x50*数组转换为1x2500线,然后得出一个公式,该公式近似于数组中每个单元格所需的值


    *阵列是否必须为50x50?如果是一个尺寸稍有不同的正方形,那么用空间填充曲线填充可能会容易得多。例如,希尔伯特曲线适用于二次幂的维数。

    您可以尝试的一件事是对1D线进行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处有峰值,在y中,在x=423、475和726处也有峰值。然而,y的全局最大值为x=503,这是ifft(f)中的峰值,但不是很高

    然而,这只会将数据使用量减少一半,因为我将1000个double转换为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在任何方向的真正峰值。但这仍然让你