有人说程序=算法+数据结构,虽说这样的认为有失偏颇,一个程序决定的东西实在太多,但某些方面也说明了算法是很重要的(数据结构承上启下,最终也是要为算法服务)。
算法是用来解决问题的,要理解什么是算法,先要明白什么是问题。而无论是狭义还是广义,算法都是用来处理问题,所以两者放在一起来理解会比较方便。
一、可形式化的问题
我们在《算法导论》、《数据结构》里面遇到的问题基本上都是可形式化的问题,也就是可以用数学语言准确描述的问题。此类问题定义明确,是数学意义上狭义的问题。问题的解决必须在有限的步骤内解决,则为算法,这里是数学上狭义的算法,或者称为“真正的算法”。但是不是每个可以形式化的问题都是可以用算法解决的,这个早在上个世纪前五十年就已经知道了,著名的图灵机停机问题就是可形式化但不存在算法可以解决的问题。我们的算法实际上本质和形式系统内定理的演绎一样,那么如同无法用算法判断所有的图灵机是否停机一样,我们的自然数体系中也存在着不可判定的命题,本质一致,不过这是题外话。
很多人应该做过类似这样的问题:假设函数f()随机返回0~24这25个整数中的一个,且返回每个整数的概率都是1/25;那么根据f函数构造另外一个函数g,返回0~5这6个整数中的一个,且返回每个证书的概率都是1/5。
这个问题是可以形式化的,题目也不是很难做,以下给出一个伪码:
function g
while true
let x = f()
if x != 24
break
end if
end while
return floor(x/4)
end function
以上伪码应该不是很难懂,g函数也的确这样被构造出来了。可是这不是算法,因为g函数可能永远都无法结束,永远都会因为f()返回24而死循环。此问题本质上和尺规作图三大经典问题(化圆为方,立方倍积,三等分角)、一元五次方程求根公式一致。
诸如围棋这样的博弈问题也是可以形式化的。终局有一个结果,可以用一个数值来代表,博弈的双方轮流选择,一方的目标是终局的结果值最小,另一方的目标是中间的结果值最大。此类双方轮流执行的离散博弈问题有个通用的算法,这是一个真正的数学意义上狭义的算法,叫做最大最小算法。做法如下:
(1)先画出博弈树,也就是遍历所有直到博弈结束的可能。
(2)从博弈树的每个树叶开始,逐次向树根,不断计算出可以得到最佳结果的选择。
递归的选择方法如下图:
从而,每一步都可以计算出得到最佳结果的选择。
最大最小算法虽然在此处通用,但未必好,因为博弈树过于庞大。以下问题可能很有名:
给定n堆棋子,两个人轮流拿棋子,每个人每一次只能从其中一堆中拿,至少拿一颗,至多把一堆拿走。当轮到的人没有棋子可拿,那么这人输,对方赢。
如果棋子足够多,那么这个问题的博弈树非常大,用最大最小算法显然是不靠谱的。可是好在我们知道,这个问题只要每次使得所有棋子个数异或结果为0,则可以立于不败之地,也就是这个算法可比博弈树最大最小算法要快速、靠谱的多。
再回到围棋,围棋的博弈树过于庞大,所以更不可能用最大最小算法来实用。所以我们只好引入人工智能来“解决”这个问题,但我们要知道这里的人工智能并不是真正数学意义上狭义的算法。
很多时候,即使问题是可形式化的,但因为问题的解决可能十分复杂,例如NPC、NPH,我们显然不是很方便通过狭义的算法来解决,刚才围棋就是一个典型的例子,于是就要引入启发性算法,这也属于AI范畴,但未必是机器学习。比如求最短Hamiton环的tsp,这是一个NPH,当然如果问给定长度问此完全图有无不超过给定长度的Hamiton环,这是一个NPC,我们可以用很多启发式算法来找最短Hamiton环,比如蚁群算法、粒子群算法、遗传算法都可以。经我实际实际验证,蚁群效果最好,粒子群提前收敛是在太讨厌,遗传算法表现也一般。
P=NP和P!=NP的情况下,P、NP、NPC、NPH的关系不太一样,这是题外话。
二、不可形式化的问题
可形式化的问题是完全理性的,虽然解决的时候启发式算法里可能引入了少许”感性"的成分。而不可形式化的问题已经不在数学的范畴之内了,也就是说,连问题本身都是充满着“感性”成分的。
很典型的就是我们的图像、声音这样的问题,这就是带有着很强的感性成分,完全不知道该如何形式化的问题。
图像处理的解决一般分为两类方法:一类是基于数字信号处理基础的手段,非常推荐Gonzalez的《数字图像处理》,这是图像处理的经典教材;另外一类是人工智能手段,一般用于识别,目前比较好的手段是卷积神经网络,前面的卷积层提取特征也可称为降维手段。当然,这两类手段并非孤立的,人工智能手段往往都是在传统的信号处理基础上来的,对于特殊的图形的神经网络识别也一样可以使用传统图像处理手段作为特征输入。
而声音的处理则一般是直接在频域上进行处理,只是一般基于传统频谱的改造,更适合于声音处理的倒谱(cepstrum),这是把采样值进行傅里叶变换后的结果取对数再进行傅里叶变换得到的谱。把声音的频谱搬移并恢复并不是太难,所以男声变女声也不是很困难的事情,所以接电话遇到陌生人通知你什么什么的时候千万要小心,这个真还未必是他原本的声音。我堂弟的公司的会计就曾经接到过董事长叫她赶快汇巨款(真的很巨)的电话,电话号码、声音全都对,她在准备汇款前一分钟突然想打个电话再确认确认,这才知道是诈骗电话,江湖险恶啊。当然,人工智能就更会有啊,深度学习识别语音现在很流行很流行。识别一定范围内的自然语言已经很OK了,这个技术我想未来也会伴随着智能家居一起爆发吧,话说我真的是一直看好智能家居啊,只是不知道什么时候会爆发。
不可形式化的问题里可能伴随着大量的开放性问题,规则不准确,而且在不断变化中,甚至没有规则可言?!这些是未来人工智能努力的方向,我还是希望人类可以把握住尺度。
当然,不是只有图像、声音,天下的事物很多,比如计算机如何辅导学生以期待获得更好的学习成果,这些问题往往都适合于人工智能的手段。智能家居如何让人更加舒适,这当然也应该是AI的天下,只是,智能家居目前要解决的问题很多,比如,进展极其缓慢的物联网便是一个重要因素。