分享

颠覆人类社会的10个算法——重塑世界的伟大构思

 老胡说科学 2024-01-04 发布于江苏
1987年,通用电气的两位程序员(William E Lorensen 和 Harvey E. Cline)创造了行进立方体算法(marching cubesalgorithm an algorithm。这个算法使得医生能够通过CT和MRI扫描的数据进行可视化处理,从而在医学诊断中发挥了关键作用,挽救了无数生命。
每当你通过编程指导机器解决问题时,实际上是在创造算法。这些算法通过重新组织数据(如1和0)来执行各种任务,从简单的如使动物发声到复杂的如控制机器人行走。尽管许多算法可能不实用或效率低下,但也有一些算法既高效又具有美学价值,甚至有的因其独特性而显得神奇。文章接下来将介绍十种颠覆式的算法。
1.波函数塌缩(Wave function collapse)
波函数塌缩是科学中最奇怪的事情之一。在双缝实验中,当不对粒子进行观测时,粒子表现出波动性质,形成干涉图样。然而,一旦进行观测,粒子的行为就会改变,显示出典型的粒子特性,表现为单个点的撞击。
这听起来违反直觉,当我们从“世界是模拟的”的角度去理解量子物理的神秘现象时,例如在双缝实验中粒子的波粒二象性,就好像宇宙本身是根据某种节省资源的算法运行的。这种解释仿佛宇宙在没有被观测时为了效率而采用波动模式,就像一个巨大的计算系统试图节约其运算资源一样。这是一个值得哲学上思考的有趣概念,但波函数塌缩的一般思想也可以在程序上实现。
想象有一个视频游戏的地图,其中的地图理论上可以无限延伸。对于这样的游戏,制作一个无限大的地图是不切实际的,因此需要一个算法来在游戏进行中实时、程序性地生成地图。这意味着地图的每个部分只有在玩家接近时才会被创建
在量子物理中,波函数描述了一个量子系统(如一个粒子)的所有可能状态。这个系统在未被观察时存在于所有可能状态的“超级位置”。当我们进行观测时,波函数“塌缩”,系统选择了一个特定的状态(比如粒子出现在一个特定位置)。
在游戏地图的情况下,可以将整个未生成的地图视为处于一种“超级位置”状态,其中包含所有可能的地图布局。当玩家移动并触发地图生成时,算法就像波函数塌缩一样选择并创建一个特定的地图区块。这个过程是随机的,但又遵循一致的规则(比如确保道路连贯),从而提供既随机又连贯的结果。
2.扩散算法(Diffusion algorithm)
扩散算法是由OpenAI最初开发的一种机器学习算法,它是像Dolly和Stable Diffusion这样的图像生成器背后的“魔法”。但扩散的概念实际上来自热力学,在热力学中,扩散是一个自然过程,其中粒子从高浓度区域自然地移动到低浓度区域,直到浓度均匀分布。这种扩散过程是朝着熵(无序度)增加的方向进行的,因为粒子从有序的集中状态分散到更无序的均匀分布。
在人工智能中,尤其是在图像生成的扩散算法中,这一过程被逆转了。算法的起点是生成高熵的状态,即充满随机噪声的图像,这类似于粒子在空间中均匀且随机分布的高熵状态。接着,算法逐步减少这种无序度,去除噪声,最终产生一个低熵、高度结构化的图像。这个过程就像是将熵减少,将粒子从随机分布转变为有序的集中分布,与热力学中的扩散过程相反。
在使用扩散算法之前,首先需要训练一个机器学习模型。这个模型需要学会如何从噪声中重构出清晰、连贯的图像。扩散算法分为两个阶段。
首先,模型在前向阶段学习如何向清晰图像添加噪声,直到图像变得完全随机;随后,在逆向阶段,模型再逆转这一过程,从噪声图像中重构出清晰、连贯的图像。经过大量标记图像的训练后,这种算法能够生成新的、独特的图像,适用于高计算强度的任务,如音频和视频内容生成。
3.模拟退火算法(Simulated Annealing)
编程和优化问题中一个常见的挑战是,对于很多问题,存在多个可能的解决方案,而找到最佳解决方案通常并不简单。
这里提到的“退火”一词源自冶金学,是一种处理金属的技术。这个过程涉及将金属加热到一定温度,使其内部结构变得柔软和可塑,然后缓慢冷却。这样做的目的是减少金属内部的应力和缺陷,从而改善其性能,如增强韧性和减少硬度。在优化算法中,特别是模拟退火算法中,这个退火过程被用作寻找问题最优解的隐喻。算法开始时,类似于冶金中的高温退火阶段,允许对解决方案空间进行广泛的随机探索。这意味着算法不仅可以探索看起来有前景的解决方案,而且可以跳出局部最优解,探索那些初看起来可能不是最佳的方案。
寻找最优解就像是在一个充满高峰和低谷的山脉中寻找最高点。简单的局部搜索方法,如爬山算法,可能会陷入最近的局部最高点(局部最优解),而无法达到真正的最高点(全局最优解)。退火算法通过在初期允许一些“坏”的移动(即使是朝向更低的点),增加了逃离局部最优并最终找到全局最优的可能性。随着时间的推移,算法逐渐减少这种探索性质,趋向于稳定在最优解上。
因为初始时有许多局部峰值,所以温度开始很高,允许算法自由探索。随着时间的推移,温度降低了,这减少了接受更差解决方案的可能性。这里的权衡是探索与利用。
4.睡眠排序(sleep sort)
有史以来最巧妙的排序算法无疑是睡眠排序。绝大多数排序算法,如快速排序、归并排序等,都使用了一些经典的计算机科学策略,比如分治法。这些算法通过将数组分解成较小的子数组来递归地进行排序,最终合并得到完整的有序数组。
然而,某位天才找到了一个更好的方法,但它有点不寻常。以下是Bash中的代码样子,它非常简单。
它遍历数组,然后对于每个元素,它打开一个新线程,睡眠时间与其元素值成比例,最后醒来后打印该元素。这是天才之举,在这种排序方法中,每个数组元素被分配到一个独立的线程,并根据其值进行相应时间长度的睡眠。睡眠时间结束后,元素被输出。这个过程实际上是利用了操作系统的CPU调度器来“排序”这些元素,因为值较小的元素会先被唤醒和输出。这种方法的独特之处在于它完全依赖于操作系统的线程管理和调度机制来实现排序,而不是传统的比较和交换操作。
虽然这种方法在理论上可行并且创意十足,但它在实践中效率低下、不可靠,并且受到操作系统调度策略的极大影响。在实际编程应用中,依赖CPU调度器进行排序不仅效率低下,而且结果的准确性无法保证,特别是在处理大数据集时。
5.量子BOGO排序
另一个奇怪的排序算法是量子BOGO排序,它尝试通过反复随机猜测来排序数组,就像玩彩票一样。但如果我们将相同的算法与量子力学应用到多元宇宙,那么每一种可能的结果,比如一个数组的所有潜在排序方式,都已经在某个平行宇宙中实现。在这种情况下,一个开发者面对一个未排序的数组,理论上在某个平行宇宙中已经存在一个排好序的版本。虽然我们的技术还无法实现跨宇宙观察或旅行,但如果能做到这一点,我们或许能够简单地观察到其他宇宙中的已排序数组,并通过一种假想的传送技术前往那个宇宙,从而获得排序后的数组。这个思路虽然纯属幻想,但在理论上提供了一个有趣的解决大型数组排序问题的可能途径。
6.shor算法
有史以来最实用和优秀的算法之一是RSA算法(Rivest-Shamir-Adleman)。RSA算法是公钥密码系统中最著名和广泛使用的算法之一。它在数字安全领域发挥着关键作用,特别是在互联网通信中。RSA允许人们在互联网上加密数据(如电子邮件),并用数字签名来验证身份和信息的完整性。
RSA算法的安全性基于一个数学上的事实:将两个大质数相乘相对容易,但反过来,要从它们的乘积中找出这两个原始的质数却极其困难和耗时。这种单向函数的特性使得RSA成为一个强大的加密工具。
尽管目前的计算机需要非常长的时间(例如300万亿年)来破解RSA加密,但量子计算的发展可能改变这一局面。量子计算机可以运行Shor算法(Peter Shor在1994年提出的一种量子算法。Shor算法利用了量子计算的独特特性来执行质因数分解。它依赖于量子位(qubits)、叠加态和量子纠缠等概念。量子位与经典计算中的位不同,它可以同时表示0和1的叠加态。量子纠缠是量子位之间的一种特殊关联,使得量子计算能够并行执行大量的计算,远超传统计算机。尽管Shor算法在理论上非常强大,但在实际应用中还面临着一些限制。到目前为止,使用量子计算机分解的最大数字是21。即使是像IBM的最先进的Q系统这样的量子计算机,在尝试分解稍大的数字(如35)时也未能成功。

随着量子计算技术的进步,未来可能需要新的加密方法来替代或增强RSA,以保持网络通信的安全。这意味着网络安全领域可能会经历重大变革,尤其是在量子计算机变得更加强大和实用时。
7.行进立方体算法(Marching Cubes)
文章开头,我提到了行进立方体算法。算法从一个三维标量场开始,这里的“标量场”指的是一个三维空间,其中每个点都有一个数字值(标量)。在医学成像的上下文中,这些标量值可以代表不同的组织密度或其他医学相关的度量。
算法选取空间中的一个点,并考虑该点及其周围的八个相邻点,共同构成一个立方体。这九个点的标量值(实际上是立方体角上的八个点)被用来确定立方体如何与所需的等值面相交。这些值被看作是一个8位整数中的位(0或1),代表了这个点是在等值面的内部还是外部。
由于每个点可以是0或1,这样一个立方体有2^8=256种不同的配置方式。每种配置对应于一个特定的多边形(或多边形组合),这些多边形用于表示通过该立方体的等值面的部分。算法沿着整个标量场移动,对每个立方体重复这个过程,从而创建出一系列多边形。这些多边形拼接在一起,形成了一个完整的三维网格,代表了整个标量场中的等值面。
在医学成像(特别是MRI)中,这个过程特别有价值,因为它允许从二维数据切片中重建出精确的三维模型,为医生提供了更详细的视图来进行诊断和治疗规划。
8.拜占庭容错机制(Byzantine Fault Tolerance)
然而,在现代,我们常常处理的是云中的分布式系统,这就引出了拜占庭将军问题(Byzantine Generals Problem)。想象一下,你是拜占庭军队中的一名将军,你和其他几位将军一起在一个城市周围扎营,计划在第二天早上发动攻击。但如果其中一个将军喝醉了,整个系统可能会崩溃。计算机有同样的问题,有时它们可能会失败或被黑客入侵,你永远不知道何时何地会发生。
幸运的是,像PBFT(Practical Byzantine Fault Tolerance,实用拜占庭容错)这样的算法被设计出来解决这个问题,它们可以保证分布式网络即使高达三分之一的节点出问题也能正常工作。
它的工作原理是,一个节点向其他节点广播一个准备消息,表明它已准备好执行将改变系统的代码。其他节点回应同意,然后在达到一定阈值后形成共识。一旦达成共识,原始节点向所有其他节点发送提交消息,然后它们就可以执行更改,使整个系统的状态保持一致。这样的算法对区块链技术和分布式云数据库等至关重要。
9.Boids算法
然而,算法真正厉害的地方在于,它们还可以反映自然界,就像Boyd的人工生命程序。它创造于1986年,模拟了鸟类的群体行为。
Boids算法之所以引人注目,是因为它能够从几条简单的行为规则出发,自然地产生出复杂且有组织的群体动态。
在Boids模型中,每个“boid”(代表一个个体,如一只鸟)遵循以下三条基本规则:
  • 分离:为了避免拥挤,每个个体会避免与附近的其他个体太接近。这有助于防止碰撞和过度拥挤。
  • 对齐:每个个体倾向于与周围个体的平均方向和速度保持一致。这有助于群体保持同一方向上的协调运动。
  • 聚合:个体会向其附近群体的平均位置移动,以保持群体的凝聚性。
这些规则虽然简单,但当应用于群体的每个个体时,会产生出意想不到的复杂行为模式。这些行为模式包括有序的群体形态、群体的规避障碍行为等,这些复杂的图案并不是直接通过编程指定的,而是从个体遵循简单规则的集体行为中自然形成的。因此,Boids算法展示了从简单规则到复杂系统行为的演化,这在计算机模拟和人工生命研究中是一个非常重要的成就。
10.Boyer-Moore算法
最后,让我们看一个古老算法——Boyer-Moore字符串搜索算法。Boyer-Moore算法的一个令人惊讶的特性是,它在处理较大的文本时,效率反而更高。这看似违反直觉,因为通常我们会期望数据量越大,搜索所需的时间越长。
Boyer-Moore算法之所以高效,是因为它采用了一种从右到左扫描文本的方法。这与大多数字符串搜索算法从左到右的扫描方式不同。
算法的两条规则:
  • 坏字符规则:当算法在文本中遇到不在搜索模式中的字符时(称为“坏字符”),它会使用一个预处理表来决定可以安全跳过多少字符。这可以显著减少比较的次数。
  • 好后缀规则:当算法找到部分匹配但随后出现不匹配时,它会利用另一个预先计算的表来决定跳过的字符数,这也有助于减少不必要的比较。
Boyer-Moore算法使用的这些规则被称为启发式方法。它们不保证在每个场景中都是最优的,但通常比逐个字符比较的方法更有效。随着文本长度的增加,Boyer-Moore算法通常可以跳过更多的字符,因此搜索速度更快。这使得它在实际应用中(如UNIX系统中的grep命令)非常高效。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多