好吧,我必须开发一个可以发现数字序列中的模式的软件,例如:
第一种模式:10,20,30,40,50..(软件必须明白数字总是计数+10)。
第二种模式:1,3,5 ...(软件必须了解数字总是奇数)。
因此,模式由用户定义,软件必须继续序列。是否存在一些算法与此建议?
PS:我正在考虑 IA 技术,例如 BackPropagation 或其他东西,但这是更好的解决方案吗?没有更简单的解决方案?
好吧,我必须开发一个可以发现数字序列中的模式的软件,例如:
第一种模式:10,20,30,40,50..(软件必须明白数字总是计数+10)。
第二种模式:1,3,5 ...(软件必须了解数字总是奇数)。
因此,模式由用户定义,软件必须继续序列。是否存在一些算法与此建议?
PS:我正在考虑 IA 技术,例如 BackPropagation 或其他东西,但这是更好的解决方案吗?没有更简单的解决方案?
假设你得到a0, a1, ..., ak
. 您可以选择几种模式:
多项式序列,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、...)等。
线性递归,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)
。
还有其他的模式,但这两种已经很强大,涵盖了很多情况。
您提出的两个问题都是线性的,因此有以下形式的解决方案
y = mx + c
例如,你的第一个是m==10, c==10
,你的第二个是m==2, c==1
。
确定像这样的线性关系是微不足道的,并且可以使用技术来确定更复杂的关系,但是教软件它们的“含义”(例如“奇数”)或多或少是不可能的。例如,要找到关系的“性质”
2, 3, 5, 7, 11, 13
您可能必须在考虑到这种关系的情况下编写一个特定的测试。
我能看到的唯一解决方案是编写一个函数来检查每个可能的模式,然后输出一次返回 true。因此,您使用第一个值检查添加了多少,然后检查下一个值是否同样大。然后检查其他人是否遵循上述模式。请注意,您的第一个和第二个示例将给出该算法都具有相同类型的模式(新值 = 最后一个值 + 常量)。
所以在 pseudoishcode 中,你的第一个函数看起来像这样:
step=value[1]-value[0]
for (value as i)
if (value[i]-value[i-1]!=step)
return false
return true
接下来,您可能想开始寻找一种检测素数的方法,我建议您搜索它,因为它是一种常见的算法。
如果你认为真的会有几乎无限的可能序列,我建议你研究一下基因编程。然后使用匹配数字的数量作为程序的适应度函数。但是,这仅在您有大量可用数据点并且可能根本不起作用时才有效。另一个问题是,这样你将无法输出正确的答案,而只能预测未来的答案。