-1

好吧,我必须开发一个可以发现数字序列中的模式的软件,例如:

第一种模式:10,20,30,40,50..(软件必须明白数字总是计数+10)。

第二种模式:1,3,5 ...(软件必须了解数字总是奇数)。

因此,模式由用户定义,软件必须继续序列。是否存在一些算法与此建议?

PS:我正在考虑 IA 技术,例如 BackPropagation 或其他东西,但这是更好的解决方案吗?没有更简单的解决方案?

4

4 回答 4

3

为了使算法能够学习任何东西,你需要一个归纳偏差,它将你的搜索空间限制在一个更小的空间,或者让你的算法更喜欢一些假设而不是其他假设。

您搜索的空间是从整数到整数的所有函数的空间。这个空间太宽了,无法做出实用的算法。您必须选择较小的空间。

另请参阅搜索和优化中的丑小鸭定理无免费午餐定理

于 2014-01-05T18:06:36.710 回答
1

假设你得到a0, a1, ..., ak. 您可以选择几种模式:

  1. 多项式序列,Ansatz an = c0 + c1*n + c2*n^2 + ... + ck*n^k:。通过k+1(0,a0), (1,a1), ...(k,ak)你总是可以拟合一个多项式k。现在这在一般情况下不是很有趣,但如果最高阶系数ck为零,则最后一个序列号ak适合由先前序列号定义的多项式。通过这种方式,您可以找到奇数、平方数、三角形数(1、1+2、1+2+3、...)等。

  2. 线性递归,Ansatz an = c0 + c1 * a(n-1) + ... + cm*a(n-m):您需要m+1用于 order 的线性递归的方程m。通过这种方式,您可以找到像斐波那契数列 ( an = a(n-1) + a(n-2)) 这样的序列,还可以找到几何数列(例如 1、2、4、8、...)和像 1、11、111、...这样的序列(an = 10*a(n-1)+1)。以下是m+1方程式:

    am = c0 + c1 * a(m-1) + ... + cm*a0

    a(m+1) = c0 + c1 * am + ... + cm*a1...

    a(2m) = c0 + c1 * a(2m-1) + ... + cm*am

    所以你可以设置m=floor((k-1)/2)st2m<k然后检查递归是否也适用于ak并且可能a(k-1)

还有其他的模式,但这两种已经很强大,涵盖了很多情况。

于 2014-01-05T18:42:06.300 回答
0

您提出的两个问题都是线性的,因此有以下形式的解决方案

y = mx + c

例如,你的第一个是m==10, c==10,你的第二个是m==2, c==1

确定像这样的线性关系是微不足道的,并且可以使用技术来确定更复杂的关系,但是教软件它们的“含义”(例如“奇数”)或多或少是不可能的。例如,要找到关系的“性质”

2, 3, 5, 7, 11, 13

您可能必须在考虑到这种关系的情况下编写一个特定的测试。

于 2014-01-05T18:03:08.350 回答
0

我能看到的唯一解决方案是编写一个函数来检查每个可能的模式,然后输出一次返回 true。因此,您使用第一个值检查添加了多少,然后检查下一个值是否同样大。然后检查其他人是否遵循上述模式。请注意,您的第一个和第二个示例将给出该算法都具有相同类型的模式(新值 = 最后一个值 + 常量)。

所以在 pseudoishcode 中,你的第一个函数看起来像这样:

  step=value[1]-value[0]
   for (value as i)
      if (value[i]-value[i-1]!=step)
         return false
return true

接下来,您可能想开始寻找一种检测素数的方法,我建议您搜索它,因为它是一种常见的算法。

如果你认为真的会有几乎无限的可能序列,我建议你研究一下基因编程。然后使用匹配数字的数量作为程序的适应度函数。但是,这仅在您有大量可用数据点并且可能根本不起作用时才有效。另一个问题是,这样你将无法输出正确的答案,而只能预测未来的答案。

于 2014-01-05T17:58:57.570 回答