“整体大于部分之和”是一句著名的格言,根据格式塔心理学,这句话概括了这样一种观点:一个系统——整体——是一种更复杂的东西,不同于它的基本元素的集合。
换句话说,试图理解一个复杂的系统,试图把它分解成它的基本部分,这一努力将不可避免地失败,留下一些单个部分无法用它们自己的方式表达的东西。
先不谈格式塔心理学,引言对理解本文的主题:蚁群优化算法(ACO)是有帮助的。
蚂蚁社会是一个组织良好、层次分明的结构,具有特定的角色和规范的行为。
尽管蚂蚁的种类很多,而且每一种蚂蚁都有自己的特点,但我们可以确定一个共同的组织结构:蚁后和工蚁。
工蚁执行蚁群的各种任务:觅食、维护巢穴、照料幼虫、防御等等。
正是通过对蚂蚁觅食行为的观察,Marco Dorigo在1992年提出了蚁群优化算法,为元启发式研究做出了贡献,也为后来的群体智能的定义做出了贡献。
这个想法源于对觅食蚂蚁行为的观察:当一只蚂蚁离开巢穴寻找食物时,她会留下一条其他蚂蚁能够跟随的信息素轨迹;如果她找到了一些食物,她会用同样的路径返回巢穴,在返回的路上留下更多的信息素。
如果她没有找到任何食物,她就不会在回巢的路上留下任何信息素,之前的痕迹就会随着时间的流逝而慢慢消失。
如果其他觅食蚂蚁会在这些小路上留下信息素,大多数蚂蚁会沿着这些小路寻找食物,并在小路上添加信息素。
另一组蚂蚁找不到任何踪迹,就会决定走其他路线。
如果我们把这种行为应用到一个大的蚁群上,我们会看到强大的信息素痕迹将巢穴与食物来源联系起来。
这种基于信息素的间接交流机制是蚁群内部知识共享的基础,并让蚂蚁找到更好的觅食路径。
从90年代早期开始,蚂蚁群体的生物学例子第一次被转化为求解组合优化问题的真正方法。
这类问题包括在约束框架内求给定函数的全局最大值。
组合优化问题可由以下模型描述: P =(S,Ω,ƒ) S是一个有限集合的变量与一个特定的有限域,Ω是变量之间的约束,ƒ是目标函数:可以最小化、最大化。
一个可行的解决方案是简单地从它们的域中收集所有赋值的决策变量,并且不违反任何的约束。求解算法将为每个变量分配一个特定的值,称为求解分量;单个解决方案是所有解决方案组件的集合。
寻找最优解和大量的约束使得这类问题难以解决,也因为穷举搜索常常是不可能的。
让我们以旅行推销员问题(TSP)为例。
问题如下: “给定一个城市列表和每对城市之间的距离,访问每个城市并返回原城市的最短可能路径是什么?”
这是一个很明显的组合优化的例子,通常不能用穷举搜索来解决,而且由于数学模型必须生成和处理大量的约束,数学精确方法无法在可接受的时间内收敛。
多年来,许多启发式算法已经发展并应用于这类np困难问题。
回到蚁群算法,我们可以使用之前介绍的P模型来形式化TSP问题:
首先,我们将表示n个城市的每个节点关联到一个变量X(i),该变量的域有n-1个值:j ={1,…,n},其中j!= i。 每条边表示两个城市之间,我们将一个数值表示信息素值τ。
当且仅当与这些值相对应的边的集合形成一个哈密顿循环时(这个约束可以在蚂蚁选择行为中引入),一个具有指定域值的所有X(i)的集合是一个解。
最后,函数ƒ(min)计算每个解决方案的边缘的长度的总和。
自提出以来,蚁群算法已经在许多不同的版本中被提出;以下是蚁群算法的一般算法思想:
begin
initialization();
while (termination condition not met) do
ConstructAntSolutions();
LocalSearch();
GlobalPheromoneUpdate();
end
end
首先,我们从一系列解决方案组件开始,这些组件将允许我们构建构造图、需要考虑的约束列表和一些将在算法中使用的参数。
在初始化步骤中,设置所有的参数,绘制构造图,并为每个变量(边)分配初始信息素值。
在构造解阶段,一组m个蚂蚁一个接一个地开始,通过遍历图来构造一个解。
每个ant都存储自己的解决方案,并在沿着图移动时更新它。
在开始阶段,所有的蚂蚁都从一个空的解开始,在每个构建步骤中,通过选择一个表示可行组件的节点来扩展当前的解。
理想情况下,这个选择组件和更新部分解决方案的过程是进行维护解决方案的可行性的,如果这是不可能的或太难维护,部分解决方案可以被删除或惩罚,这取决于违反约束的程度,一旦它已经完成。
选择过程是为每个解决方案组件计算其被选择的可能性:
τ:弧上的信息素,η是启发式信息,现在,我们可以将其定义为每个组件的特殊价值的解决方案。(下文几行将对此进行描述)。
N(s(p))是可添加维护可行性的解决方案组件集。
α和ß参数的值初始化步骤中固定的相对重要性决定了信息素和启发式信息的价值。
一旦p被计算出来,我们可以应用所谓的伪随机比例规则:
其中r是0和1之间的随机数,q0也是0和1之间的固定参数,作为r的阈值,使我们更加重视勘探和开发。
事实上,如果r大于等于q0,蚂蚁会根据p (exploration)的概率分布,在解的分量之间随机选择。
启发式信息是在组件解决方案(节点)上计算的一个数值,该数值代表了该组件在问题特定知识方面的质量或重要性。
启发式信息可以在初始化步骤中预先计算,也可以在运行时计算。
对于大多数np-难问题,启发式信息是先验的,在整个算法执行过程中启发式信息不会改变。
在其他情况下,启发式信息依赖于到目前为止构造的部分解,因此在每一步计算。
以TSP为例,η是由边缘的长度定义:d (ij) - 1。 LocalSearch步骤是可选的;这个阶段的目的是通过利用问题知识,即移动和替换一些解决方案组件来改进蚂蚁获得的解决方案。
最后,在全局信息素更新中,对信息素的沉积和蒸发过程进行了图形化处理。
此阶段的目标是使好的解决方案更适合下一个迭代。
这是通过两种方法实现的,第一种方法是增加信息素值在属于最佳解决方案或好解决方案列表的边缘,然后模拟信息素蒸发。
在这个过程的这一点上,我们已经有了一个由蚂蚁产生的完整解决方案的列表;此外,我们可以通过所谓的评价函数或目标函数来评价这些解,它们决定了给定完整解的质量(TSP中距离的总和)。
对于这一阶段,也存在许多信息素更新的方法,例如,我们可以决定加强信息素的单一最佳解决方案到目前为止。
对于当前迭代的每个完整解决方案,通常的方法更加通用;我们使用以下公式更新每个信息素变量:
1是残留在边缘的旧信息素的比例
(0 <ρ< 1)和2是评价的总和函数包含的特定的组件。
因此,如果任何解都没有考虑到当前的边i-j,则公式的第二项为0,信息素通过简单的蒸发机制进行更新(1)。
信息素更新后,检查终止条件,看看结果是否足够好,例如,如果在连续的100次迭代中没有改进最佳解决方案,我们可能会决定停止。
现在我知道了蚁群优化是什么,我能得到什么呢?
蚁群算法的应用非常广泛,并且涉及到不同的领域,这里有一些例子:
以及其他许多应用
其广泛的潜在应用源于整个方法的灵活性,在引入信息素机制的同时,还引入了信息素分布和评估阶段的特定问题知识。
在对蚁群算法进行总结之前,有必要展示一个蚁群算法在数据科学中一个常见研究领域的应用实例:特征选择。 高维空间问题是影响数值分析、机器学习、数据挖掘等数据集的常见问题。
先不考虑高维空间可能带来的问题(更多地了解它),有趣的是蚁群算法如何被用作特征约简方法。
从一个包含n个特性的列表开始,我们希望减少整个集合,搜索包含最重要和最有代表性特性的子集。
首先,由于蚁群算法是基于图元启发式的,我们需要布局整个图。
图的每个节点代表了初始n个特征集的一个特征,每条边代表了从实际特征到另一个特征的选择。
每个ant将从一个空的特性集开始,遍历图,访问满足遍历停止条件的最小节点数,最后输出一个候选子集。
虚线:可能添加的特性,黑线:ant特性选择
如图所示,在节点A上开始的蚂蚁执行了一条到节点F的路由,然后停止构建满足遍历停止条件的子集{A, B, C, D, F}(例如,适当的高分类精度)。
启发式信息可以通过任何适当的度量函数来计算,例如,基于熵的度量是非常有效的。 蚂蚁的选择过程和信息素的更新是用相同的方法描述的。
整个过程遵循以下步骤:生成m个蚂蚁,并在图中随机放置。
从这些随机位置开始,每只蚂蚁通过遍历边缘来构造路径,直到满足遍历停止条件。
收集所有子集并进行评估;如果其中一个子集足够好,或者迭代已经执行了一定次数,那么流程就会停止,并返回找到的最佳子集。
如果这些停止条件都不成立,信息素就会更新,新的蚂蚁群就会产生,新的迭代就会开始。
如前所述,蚁群算法是通过对动物世界的观察而产生的,特别是通过对大群单一的简单有机体(如蚂蚁)的观察而产生的。
这种直接来自自然的直觉证明动物世界可以成为灵感和知识的来源。
蚁群算法是当今解决多重问题的一种众所周知的、可靠的方法;它存在于各种各样的简单或非常复杂的形式化表达中。
蚁群算法的优点之一是能够快速发现好的解;这种优势有时会被过早的趋同所抵消。
尽管蚁群算法不适用于连续问题,但它确实是许多优化/离散问题的有效解决方案,值得包含在数据科学家的工具箱中。