《Java遗传算法编程》—— 1.4 进化计算的优势

简介: 智能机器在我们社会中的采用率正好确认了它们的有效性。我们用计算机来解决的绝大多数问题可以归结为相对简单的静态决策问题。随着可能的输入和输出的数量的增加,这些问题很快会变得更复杂,而且如果求解需要适应变化的问题,只会进一步复杂化。

本节书摘来异步社区《Java遗传算法编程》一书中的第1章,第1.4节,作者: 【英】Lee Jacobson(雅各布森) , 【美】Burak Kanber(坎贝尔),更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.4 进化计算的优势

智能机器在我们社会中的采用率正好确认了它们的有效性。我们用计算机来解决的绝大多数问题可以归结为相对简单的静态决策问题。随着可能的输入和输出的数量的增加,这些问题很快会变得更复杂,而且如果求解需要适应变化的问题,只会进一步复杂化。除此之外,一些问题也可能需要一种算法,搜索大量可能的解,试图找到一个可行解。根据需要搜索的解的数量,经典计算方法可能无法在允许的时间内找到可行的解,即便采用超级计算机也不行。正是在这种情况下,进化计算有了用武之地。

为了让你对传统计算方法能解决的典型问题有所了解,请考虑一个交通灯信号系统。这是相对简单的系统,只需要基本水平的智力操作。交通信号灯系统通常只有少量的输入,让它注意一些事件,如汽车或行人正等待通过路口。然后,它需要管理这些输入,并正确地改变信号灯,让汽车和行人有效地通过路口,而不会造成任何事故。尽管操作交通灯系统需要一定量的知识,但它的输入和输出都相当基本,可以让人来设计和编写一组指令来操作交通灯系统,这并没有太大的问题。

我们常常需要一个智能系统来处理更复杂的输入和输出。这可能意味着它不再简单,或许不可能让一个人编写一组指令,使机器将输入正确地映射到可行的输出。在这种情况下,如果问题的复杂性使得它不适合人类程序员编码解决,那么优化和学习算法就可以为我们提供一种方法,利用计算机的处理能力找到问题本身的解。这方面的一个例子是构建欺诈检测系统,该系统可以根据交易信息,识别欺诈交易。尽管交易数据和欺诈交易之间可能会出现关系,但它可能依赖于数据本身的许多精细模式。输入中的这些精细模式可能很难由人类来编码,这使它成为应用进化计算的很好的候选者。

如果人们不知道如何解决一个问题,进化算法也很有用。这方面的一个经典例子是NASA(美国航空航天局),当时他们在寻找一个天线设计,满足对2006年的太空任务的所有要求。NASA写了一个遗传算法,进化出一个天线设计,满足所有具体的设计约束,例如信号质量、尺寸、重量和成本。在这个例子中,NASA不知道如何设计天线来满足所有的要求,所以他们决定写一个程序,而该程序可以进化出一个设计。

另一种我们也想采用进化计算策略的情况,就是问题是不断变化的,需要一个自适应的解。在建立算法预测股市时,就会遇到这样的问题。对这周股市预测准确的算法,可能无法在下周做出准确的预测。这是因为股市的模式和趋势不断变化,因此预测算法非常不可靠,除非在新模式出现时,它们能够快速适应不断变化的模式。进化计算可以帮助适应这些变化,提供一种方法,让预测算法具备必需的适应性。

最后,有些问题需要搜索大量的,或者也许是无限的可能解,来找到最好的或足够好的解。本质上,所有进化算法都可以看成是搜索算法,它们搜索一组可能的解,来寻找最好(或“最适合”)的解。如果将一个生物体的基因组中所有可能的基因组合看成是候选解,就可以看清这一点。生物进化非常擅长于搜索这些可能的基因序列,找到足以适合其环境的解。在较大的搜索空间,很可能(即使用进化算法)找不到给定问题的最佳解。然而,这对大多数优化问题基本上不是问题,因为通常我们只需要足够好的解,把工作完成就可以了。

进化计算提供的方法,可以看成是一种“自下而上”的模式。这时候,从算法中涌现的所有复杂性来自简单的、基础的规则。另一种模式是“自上而下”的方法,需要在人编写的算法中展现所有的复杂性。遗传算法对于开发来说相当简单,这让它们成为有吸引力的选择,否则就需要复杂的算法来解决这个问题。

下面是一个问题特征列表,这类问题是采用进化算法的良好候选者:

如果问题足够困难,难以写代码来解决;
如果人不知道如何解决这个问题;
如果问题是不断变化的;
如果搜索每个可能解是不可行的;
如果可以接受“足够好”的解。

相关文章
|
2月前
|
Java
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
27 0
|
2月前
|
存储 Java
Java:编写程序,计算两个数的和、差、积、商和余数。docx
Java:编写程序,计算两个数的和、差、积、商和余数。docx
|
2月前
|
机器学习/深度学习 算法
递归算法题练习(数的计算、带备忘录的递归、计算函数值)
递归算法题练习(数的计算、带备忘录的递归、计算函数值)
|
2月前
|
算法 Java
算法:Java计算二叉树从根节点到叶子结点的最大路径和
算法:Java计算二叉树从根节点到叶子结点的最大路径和
|
2月前
|
存储 Java
Java 编程实例:相加数字、计算单词数、字符串反转、元素求和、矩形面积及奇偶判断
Java中相加两个数字可通过简单赋值实现,如`int sum = x + y;`。若要用户输入数字相加,可使用`Scanner`类读取。计算单词数,可使用`split()`方法或`StringTokenizer`类。反转字符串,可用`for`循环或`StringBuilder`的`reverse()`方法。计算数组元素总和,可遍历数组累加。矩形面积通过长度乘以宽度得出。判断奇偶性,利用模2运算或位运算检查最低位。更多内容,可关注微信公众号`Let us Coding`。
50 0
|
8天前
|
算法 TensorFlow 算法框架/工具
基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证
这是一个关于图像处理的算法实现摘要,主要包括四部分:展示了四张算法运行的效果图;提到了使用的软件版本为VIVADO 2019.2和matlab 2022a;介绍了算法理论,即基于直方图的图像阈值分割,通过灰度直方图分布选取阈值来区分图像区域;并提供了部分Verilog代码,该代码读取图像数据,进行处理,并输出结果到"result.txt"以供MATLAB显示图像分割效果。
|
10天前
|
Java
Java 事件驱动编程:概念、优势与实战示例
【4月更文挑战第27天】事件驱动编程是一种编程范式,其中程序的执行流程由外部事件的发生而触发或驱动。
19 0
|
10天前
|
Java 程序员
Java 异步编程:概念、优势与实战示例
【4月更文挑战第27天】在现代软件开发中,异步编程是一种重要的编程范式,特别适用于处理长时间运行的任务,如网络通信、文件操作等。
19 0
|
10天前
|
Java 数据处理 API
Java 函数式编程:概念、优势与实战示例
【4月更文挑战第27天】函数式编程(Functional Programming,简称 FP)是一种编程范式,它将计算视为数学函数的求值并避免使用程序状态以及可变数据。
17 1
|
10天前
|
Java Shell API
Java 模块化编程:概念、优势与实战指南
【4月更文挑战第27天】Java 模块化编程是 Java 9 中引入的一项重大特性,通过 Java Platform Module System (JPMS) 实现。模块化旨在解决 Java 应用的封装性、可维护性和性能问题
19 0