简单数字电路里的智慧
陈凯
一只出门远行的兔子在大森林里遇到了岔路,一条路宽敞明亮,另一条狭窄幽暗,那么该走哪条路呢?这只兔子(假设它很笨)从包袱里掏出指路神器,想听听指路神器的建议。以上是笔者在课堂上使用的教学场景,它很虚幻,好像童话故事,笔者称之为虚幻但真切的情境,一方面,很多小说或电影里都有类似的情节,另一方面,这也是在玩电子游戏时,玩家常常要面对的场景。有人会问,用应用市场上常见的某某导航软件来决定路线,难道不更贴近生活实际吗?若考虑到参与选择并做出决策的亲历性和真切性,并同时考虑到问题的纯粹性和简洁性,笔者更愿意将童话故事作为自己的教学场景。关于虚构场景的内在真实与外在现实之间的复杂关系,哲学界已有颇多讨论,这里就不展开了。
一个产生混乱数据的系统——没有任何作用
假设兔子面对宽敞明亮的道路,并在使用指路神器时,输入了关于道路的信息,若道路状态就是“宽敞明亮”和“狭窄幽暗”两种,那么当然就可以用一位二进制编码来将现实状态编码为数据,如“宽敞明亮”编码为“1”,“狭窄幽暗”编码为“0”;对于输出来说,“1”代表可以走这条路,“0”代表不能走这条路。
兔子从包袱里拿出的一号指路神器内部的结构如图1所示。
这里借用Logisim软件的数字逻辑电路来模拟操作过程,步骤是:先用输入按钮确定道路的状态是“0”还是“1”,然后双击图样得到输出结果。兔子第一次操作得到的结果是“1”,不过第二次操作,得到的就是“0”,后来它发现,得到“0”和“1”的次数其实是随机的。很显然,这个所谓的指路神器没有任何用处。
其实,电路图中, 是一个随机发生器,其结果和扔硬币是差不多的。但若要把随机发生器拆掉,那也是不行的,兔子发现,为这个装置供电的设备,也被集成到了随机发生器中。这个设定乍看上去有些奇怪,但从物理学的角度说,能量和混乱度两者间的确是有关系的。
好在包袱里有不少电子元件,接下来,当然是要让这个系统变得更稳定。
一個产生更稳定信息的系统——但对兔子没用
将不稳定的输出信号变稳定,可以采用一种奇怪的方法,就是多用几个随机发生器,再配上一些逻辑门就可以了。例如,若要得到稳定的“1”,则可使用或门,若要得到稳定的“0”,则可使用与门,如果在电路中加上一个移位寄存器,则能看到输出“0”和“1”的比例,为了使效果更逼真,需要在最开始,为不同的随机发生器获取不同的随机种子。在实验中可以看出,三个随机发生器生成的“0”和“1”的比例大概是1比7,由此对应的信息熵是0.543564,信息熵的计算可以借助信息熵计算工具,之前文章里已有介绍,这里不再重复叙述。整个装置的逻辑电路图如下页图2所示。
如果有时间,还可以将此装置的运行与相同功能程序代码的运行相呼应,如图3所示的Python代码,实验结果与数字电路装置大致相同。
很容易推测得出,如果增加更多的随机发生器,则输出结果就更加稳定,不妨称之为二号指路神器(如图4)。
和一号装置有明显区别的是,这个装置可以得到更稳定的输出“1”,兔子也至少可以获得“1”这个信息,并且可以看出,这个系统是如何通过逻辑门消除混乱的。这其实也对应着香农关于信息的定义:信息是消除随机不确定性的东西。越来越多的混乱信号源,反而会产生越来越稳定的信号,是不是有些不可思议的感觉?其实,这要归功于信号源和逻辑门共同组成的逻辑运算的规则系统,为了维护这个规则系统的运行,是需要依赖外在能量的。也就是说,在外在能量的支持下,一个系统可以消除随机不确定性而产生信息。
但这个系统对兔子来说,并没有啥作用,因为无论它面对的是宽敞明亮还是狭窄幽暗的道路入口,所谓指路神器给出的结果都是一样的。这当然不是说,这个装置是全然没有用处的,因为这个装置很直观地展现出系统消除混乱的过程,如果学习了更多复杂系统相关知识,就能知道,可以通过将系统的运行结果反馈到系统输入端,对初始混乱的数据进行反复迭代,逐步模拟出有更高“智慧”的装置。
一个简单的知识系统——对兔子有用
在上述装置的结构上进一步扩充(如图5),这个系统才能说对兔子是有用的,指路神器中存放有兔子先行者们的历史数据,走宽敞明亮道路的32只兔子,存活了23只,走狭窄幽暗道路的32只兔子,存活了1只。电路图左下角的按钮,是用来确定当前面对的到底是哪一条道路的入口。注意,这只笨兔子并不会数据分析,但这个指路神器却可以告诉它,是否应该走当前的道路。那五个随机发生器偶尔会产生出干扰信号,会使得系统不完全按照历史数据来做出决定,但这其实也很符合现实,因为客观世界本来就不是一个确定性的世界。
这个系统的运行结果是,宽敞明亮的道路是应该优先选择的。虽然最终的电路图略为复杂,但教学中的重点并不是电路的搭建,而是从一个只能产生混乱数据的系统,逐步扩充到一个能具有一定“智慧”的决策系统的演变过程,教师可以只进行演示实验,也可以让学生动手交互操作,观察输入和输出数据的情况。在整个装置逐步演变和扩充的过程中,涉及信息和信息熵的概念、二进制编码、布尔值与逻辑运算等知识,这样,就能通过一个统一的实验框架,将日常教学中零散的知识内容融合到一起,并且,将较为抽象的概念,以动态直观的形式展现出来。