算法中的仿真
——从数列求和谈起

2022-12-06 08:15陈凯上海市位育中学
中国信息技术教育 2022年23期
关键词:指令建模现实

陈凯 上海市位育中学

唐代孙誧写过一篇名叫《一行算法》的文字,看名字它很像学术著作,其实是一首诗:

一行寻师触处游,

到天台后始应休。

因知算法通天地,

溪水寻常尽逆流。

诗末原跋讲了一个有趣的故事:一行穷大衍算法,求访师资不远千里。尝至天台国清寺,见一院古松,门有流水。一行立于门屏,闻僧于庭前布算之声,谓其徒曰:“今日当有弟子自远来,求吾算法……门前水合却西去,弟子当至。”一行闻其言而入,稽首请法,授其术,而门外旧东流水,忽改而西流矣。撇开故事中积极配合演出的具有超现实主义特征的溪流不谈,今人考证认为,一行在天台山学习的很有可能是某种与历法相关的计算方法。同时,这个故事还印证了古人所说的算术和算法就是同一个意思。

吴文俊认为,中国古代数学是算法化的数学,而不是公理化的数学。今人读古人算学方面的著作,能感受到其相当统一的特征:针对某一类型的问题给出一个普遍适用的计算过程。举例说,南北朝时期,张丘建著有《张丘建算经》,其中创设了一个“女不善织,日减功迟”的情境,说其初日织五尺,末日织一尺,三十日织讫,问织几何。由于每天减少的织布量都相等,给人一种并非“不善织”,倒更像是处心积虑地磨洋工的感觉。对于提出的“织几何”之问,张丘建给出了明确的算法:并初末日织布数半之余以乘织讫日数。这其实就是等差数列求和的公式:首项加末项乘以项数除以二。到了宋代,人们对等差数列有了更深入的研究,沈括的《梦溪笔谈》第十八卷中有如下记载:“隙积者,谓积之有隙者,如累棋、层坛及酒家积罂之类。虽似覆斗,四面皆杀,缘有刻缺及虚隙之处,用刍童法求之,常失于数少。余思而得之……古书所不到者,漫志于此。”书中详细描述了求解高阶等差数列的方法,作者还特别提出“古书所不到者,漫志于此”,其创新精神值得赞赏。到了元代,朱世杰进一步给出了任意高阶等差数列求和的普适性的方法。

西方的算法一词“algorithm”源于对波斯学者花拉子模(Khwarizmi)的音译,而在中文语境中,“算法”一词的含义自古至今是一贯的,且几乎是不言自明的。说起信息技术或信息科技学科教师,相信他们都认为是能够理解“算法”一词的概念的,且认为算法部分的教学活动,是能够甚至于说是最适合用来落实计算思维培养目标的。但结合具体的教学活动设计来思考计算思维培养的落实,仍会生出不少疑惑。例如,若直接套用数列求和公式,用语句s=(1+n)*n/2求出从1开始的等差数列和,在这个过程中,到底哪里体现出计算思维的培养?怎样的算法设计过程能体现计算思维的运用?甚至还可以这样问:一行、张丘建、沈括等人是否具有计算思维?

● 从算法解决问题的一般过程考察三种等差数列求和的方法

使用算法解决问题,一般可分为抽象与建模、设计算法、编写程序、调试运行这样几步。其中,抽象与建模的过程与计算思维的运用相对来说有着更紧密的联系,可以重点围绕这一步来考察多种不同的用计算机进行等差数列求和的过程在思维方法上的区别。下页图1所示的是1、2、3直到10的数列求和的三种不同的算法。

图1 三种1、2、3直到10的数列求和的算法

第一种方法只是简单地将数列求和的需求用符号表达了出来,很难让人感受到其中有抽象和建模的过程,若数列项很多,就完全无法利用自动化的优势(无论是对计算机还是对人来说);第二种方法直接套用了等差数列求和公式,这个公式的获得过程本身,的确是体现了抽象和建模的过程,这种抽象与建模更多和数学思维方法的运用(如数形结合)有关,但代码的编写者极有可能只是简单地了解公式的作用并应用了这个数学思维的成果而已;对于方法三,直观上感觉其中的确经历了抽象和建模的过程,并且也能感知到这种抽象和建模的过程与方法二有所不同,但若进一步追问其中究竟抽象了什么,又建模了什么,与方法二区别在哪里,就很难回答了。若说方法三中的递归的运用就是一种抽象和建模,或者也可以引用他人的“递归是一种抽象的表达方法”的观点,但这仍然未能点明所抽象的是什么的问题,也就是说,到底是从哪些事物中抽取出共同的、本质的特征的这样一个问题,仍然没有得到解答。

● 算法中的拟像与仿真

哲学家鲍德里亚提出过对不同“拟像”的分析。拟像的第一序列是符号对真实的表征,但很容易被发现符号与真实的区别;在拟像的第二序列中,符号表征逼近真实,因此符号表征和真实之间的界限是模糊的;在拟像的第三序列中,拟像的世界高于真实,拟像具有非指涉性,它不是对某物的再现而是其自身的展现,具有某种扭曲真实的能力。使用艺术的例子能更容易理解鲍德里亚的想法,阿尔塔米拉洞窟中的公牛绘画就是第一序列拟像的例子,正如鲍德里亚所说的那样,是“艺术是对现实拙劣的模仿”;超级现实主义的艺术品(请注意与超现实主义相区分)讲究一种对真实的极致再现,可以看作是第二序列拟像的例子;而数字技术所创造出来的不具有现实对应物却具有真实感的虚拟场景,则是第三序列拟像的例子,鲍德里亚称其为仿真(Simulation)。

很有意思的是,仿真(Simulation)也是计算机科学中常用的概念,通常指一个程序模拟某一种事物的行为。Simulation和Emulation这两个词语都被翻译成仿真或模拟,但两者是有区别的:Simulation是行为上的仿真,它模仿的是一个对象外在的行为,而对象内部要实现这种模拟,可能会采取与事物本身并不一致的方法;而Emulation是一种过程上的仿真,它要求这种模拟能对应对象真实的内部运作的状态,并且由内部的模拟过程来达成对象行为上的仿真。

本文要讨论的,不是用算法去对某个事物实施仿真,而是考察算法自身是不是一种仿真。不妨试着将算法看成是人类创造的艺术品,而需要去模仿的则是人类实现计算的思维过程,那么就很容易借用鲍德里亚的理论对不同类型算法中思维运用的特征进行分别。在上一节的第一种方法中,“s=1+2+3+4+5+6+7+8+9+10”的语句并没有完成对人类解决问题的思维过程的刻画,换句话说,它相当于对某一计算装置交待任务,要求其求出1、2到10的数列的和,至于计算装置如何实现此功能,却和此算法的设计者无关。因此可以说,这样的算法没有实现任何对人类思维过程的拟像。

但算法的确可以对思维过程进行一种“拙劣”的模仿,注意,这里的“拙劣”一词并不自带褒贬的意味。例如,读者可以自行设想在头脑中对数列进行累加的过程,比较多见的变化场景可能是这样的:首先,头脑中浮现出左面一个1和右面一个2这两个数字的影像(或者还会有后续的3、4、5等数字,但可能会因为注意力的转移而“失焦”),当1和2相加得到3的时候,右面原来的2也同时变化为3(在某些想象中,可能是某个新出现的3挤入了原来2的位置),然后进入到下一轮,实施3加3得6的计算,与此同时,右面原来的3变为4。可以将这个想象过程描绘成一个虚拟的运算机器,如图2所示,细线箭头表示的是运算动作的第一步,左侧相加的动作可以和右侧加1的动作同时进行,或不分先后地进行,粗箭头表示的是运算动作的第二步,同样,两个动作可以同时进行,或不分先后地进行。这个算法从行为上看,是和一些人的思维过程一致的。

反复执行以上过程,并辅以监督,用来在恰当的时候停止运算,图2中所写的是“当到达10时则执行最后一步”,而不是“当到达11时停止”,意图是尽量趋近人的思维习惯。这个算法很容易用程序代码编写出来,于是可以说,可以用符号作为思维过程的抽象。值得一提的是,可以参照如图3所示的电路原理图搭建出电路,其中采用了寄存器、加法器、比较器和缓冲器芯片,其运行契合符号表达的算法,也契合人的思维过程,于是,对现实中思维过程的抽象又反过来实体化为现实中的变化过程。

图2 一种常见的可在头脑中实施的求数列和的思维过程演示

可以用此算法比对教学中常见的用循环语句解决数列求和问题的算法,这里称为方法四,如图4所示,可发现此方法与图3所示的更接近真实思维过程的方法存在部分偏离。例如,存储空间初始值不是从1、2开始,加法计算也需要严格分步骤按顺序进行,这种偏离往往会成为理解算法的思维路途中的堵塞点,而偏离的原因是,当今的算法大多是为通用且异步执行指令的计算机架构设计的。

图3 使用多种芯片实现数列求和的原理图

图4 一种更契合常见的算法(但可能偏离人的惯常思维)的求数列和的思维过程演示

这里来对比上一节所提到的第二种方法,也就是直接套用数列求和公式的方法进行分析,就能发现,方法二中程序代码中的求和实施过程,和人的思维中的求和实施过程,在行为上是一致的,换句话说,代码的编写者不可能在不知晓求和公式的用途的情况下,就采用这个公式进行计算。对于一个进行心算或笔算的人来说,数列求和公式具有某种自动化的效果,这种效果在数学公式被转换为程序代码后继续存在,因此,计算机中的算法成了人的思维过程的一种拟像。但方法二的拟像只能属于第一序列的拟像,这是因为当聚焦于细节时,计算机的运算过程就变得和人很不一致了。例如,人做6加4运算的具体过程必然和计算机是不同的。由于到目前为止,或者,在可想象的未来相当长的时间内,在物理程度上对人脑思维运作的还原是难以达成的,所以算法就难以达成逼近人类思维真实的拟真。鲍德里亚曾提及博尔赫斯的小说《关于科学的精确性》,小说中描述了一个关于地图制作者将地图绘制得如此精细以至于能精确地涵盖帝国领土的每一处,致使地图和现实之间无法区分的故事。对计算机算法来说,要实现如此程度的对思维过程的拟像,是既不可能也没有必要的。

如果说方法二中所体现出来的是第一序列的拟像,那么方法四所体现出来的,是否与方法二类似,同样是一种对人类思维的行为上的模仿呢?在细致观察后可认为,在方法四中,除去对人的思维过程在行为上模仿这一事实,它不仅存在着一种有意为之的对人的思维过程的偏离,还存在着为了实现不可能达到第二序列拟像效果的一种在内在过程级别(Emulation)上的填补,在填补过程中需要引入某些不能对应现实已有事物的新的设定。

● 拟像的先行

第三序列的拟像是一种当前没有对应现实实体的创造物,是一种对真实的超越。仔细思考一下,若将算法视作一种艺术,那么当它在被某个人用作计算时,无论是心算、笔算或编写成程序代码使用,都可以看成是第一序列的拟像,这种符号化的算法最多只能在外在行为上对人类思维进行模拟,它不可能具有趋近人的思维底层完全还原出物理运作过程的能力。然而,当试图将算法转换成为一种自动化的装置时,一种数字化创造的真实就取代了真正的现实。思考这样一个例子,想象一个虚拟的机器人是如何根据用循环语句实现数列和累加的代码执行运算过程的,如图5所示。可以想象出,机器人会在图示右侧的指令和图示左侧的存储空间之间来回穿梭,根据指令对存储空间的数据进行改写。

图5 想象中一个机器人如何执行指令改写数据

尽管容易设想一个机器人能够逐个执行指令,但对于机器人如何执行#3指令,还是会让人生出疑惑,因为#3其实是一个针对指令本身应当如何执行的指令。想象机器人内部有一系列的齿轮,在执行#1的时候,这些齿轮以某种虚构的方式转动着,在完成#1指令后,机器人执行#2,此时这些齿轮又以某种虚构的方式转动着,但在机器人面对#3指令中“重复做”的时候,人的头脑的理性会说,这里齿轮的转动,一定存在着某些和先前的转动本质上不同的地方,但头脑却很难虚构出足以能说服自己的某种存在截然区别的转动方式。虽然如此,当代人的头脑又倾向于认为,#3指令应当是可以实现的(不妨想象一下古人会轻易认同吗)。当教师讲授循环语句结构的时候,似乎不会有学生来质疑循环结构本身的存在,但熟知CPU架构的教师自己内心知道,支撑循环结构的语句是由人创设出来的文本,它需要翻译成一系列的对应电平信号变化的底层机器指令才能真正得到运作。所以说,对于当今的学生或大部分编写计算机算法的人来说,算法俨然就是超越真实的拟像。

不妨想象一下,如何用绘制想象中的机器人的运行过程来描述使用递归实现数列求和,也就是前文提到的方法三的例子,其中遇到的最大的难点,是在机器人执行递归函数调用自身时,这种描绘是如何实现的。一种合理的想象是,机器人每次执行递归函数就会复制自身结构并幻化出一个新的机器人(笔者最早是在特级教师陈大波老师的课上看到这样的描绘方法,并且,至今还未能设想出更好的描绘方法),对比物理现实,这种想象显然颇有魔幻色彩,但在符号化的世界中却能毫无障碍地演示出完整的递归过程。相较于方法四中循环的方法,方法三中的递归不仅从行为上模拟了运算过程,更是模拟了运算过程得以机械化实现的可能方式,因此,相对循环语句结构,用递归实现指令的重复执行,更具有内在过程模拟(Emulation)的特点。

鲍德里亚曾提出拟像先行的概念,这个概念描述了人们逐渐远离对现实的直接经验而进入到以符号为基础的仿真环境中的过程。“先行”其实暗示了一种“后行”,第三序列的拟像有着拉扯现实的作用,也就是说,为了使得先行的概念真正在数字世界中以虚拟物的形式运行起来,就必须反过来对现实进行改造。历史上,图灵首先创设了纯粹作为思维实验的图灵机,在多年后图灵完备的计算机真正被制造出来,可看成是拟像先行的一个案例。笔者认为,计算思维应当和拟像的先行以及这种先行的拟像反向改造现实的过程有关。举例说,某问题的解决虽然可以用枚举算法得到解决,但若学生在思考问题解决的方法时,便已经被告知了枚举的方法,那么枚举就成了一种可被实际使用的超真实之物,计算思维因而隐遁,计算思维的培养目标就难以实现。反之,如果要求学生对虚拟计算装置的运行原则先行加以设定,然后根据这些设定构造模型,这样就可能会产生出对应枚举、递归、并行处理等多种模型——虽然这些模型均已存在,但在教学过程中,需要假设它们尚未被创设出来,然后再逆向地在现实中寻找支撑实现这个模型的可用之物,这是一种与数学思维有很大区别的抽象与建模的方式。

● 对先前提出问题的解答

本文试图从拟像理论的角度,对先前提出的问题给出回答,仅供参考。

1.直接套用数列和公式的算法是否体现出计算思维的运用?该算法设计者至少知道,存在着一种可解决问题的数学模型,并且知道可以借助计算机代替人来实现计算。但若仅此而已,便停留在第一序列的拟像,无关计算思维的运用。

2.怎样的算法设计过程能体现计算思维的运用?算法的设计者应当认知到,现有的计算模型是一种拟像的虚拟物,对这种虚拟物的使用本身不体现计算思维的运用,所以要么重构模型,要么利用已有模型创设出新的模型,这种创设新模型的目标将产生一种驱动力,使设计者要么利用和改造已有的现实中的装置,要么利用和改造那些已有的基于现实装置的虚拟模型,使这个作为新目标的模型运转起来。

3.一行、张丘建、沈括等人是否具有计算思维?计算思维的运用需要计算机科学发展与数字化技术被广泛应用的时代背景,一行、张丘建、沈括等应当没有运用计算思维的机会。问一个有趣的问题,如果他们穿越到当代,是否能学会如前文方法三或方法四中运用循环语句实现数列求和的方法?笔者认为完全有可能,但就算是这样,也难以断定他们在求解问题的过程中,运用到了计算思维,除非他们产生出一种构建新的计算模型的目标并将其实现。

猜你喜欢
指令建模现实
基于FLUENT的下击暴流三维风场建模
基于 Verilog HDL 的多周期 CPU 设计与实现
我对诗与现实的见解
联想等效,拓展建模——以“带电小球在等效场中做圆周运动”为例
《单一形状固定循环指令G90车外圆仿真》教案设计
求距求值方程建模
漫画:现实背后(下)
基于PSS/E的风电场建模与动态分析
中断与跳转操作对指令串的影响
MAC指令推动制冷剂行业发展