探究群体智能:使用Python实现粒子群优化(PSO)、萤火虫算法(FA)、布谷鸟搜索(CS)、蚁群优化(ACO)与人工蜂群(ABC)

在本篇文章中,我们将探索几种基于群体智能的优化算法,这些算法模拟了生物群体中出现的协同行为,并用以解决复杂的优化问题。具体来说,我们将探讨以下五种算法:粒子群优化(PSO)、萤火虫算法(FA)、布谷鸟搜索(CS)、蚁群优化(ACO)和人工蜂群(ABC)。我会尽可能地解释每种算法的基本原理,并展示如何使用Python进行实现。

实战项目下载

粒子群优化(Particle Swarm Optimization,PSO)

PSO是一种群体智能优化技术,最早由Eberhart和Kennedy在1995年提出,用于解决连续非线性优化问题。其基本理念来源于鸟群觅食行为的观察。

粒子群优化中,群体由“粒子”组成,每个粒子代表在问题解空间中的一个可能解。每个粒子有一个位置,表示当前解,以及一个速度,表示解变化的方向和幅度。在每一次迭代过程中,粒子根据自身和群体的最优解来更新其位置和速度。

粒子位置的更新公式如下:

x(i) = x(i) + v(i)

粒子速度的更新公式如下:

v(i) = w * v(i) + c1 * rand() * (pbest(i) - x(i)) + c2 * rand() * (gbest - x(i))

其中,x(i)表示粒子i的位置,v(i)表示粒子i的速度,pbest(i)表示粒子i的历史最优位置,gbest表示群体的历史最优位置,w是惯性权重,c1c2分别是个体和全局学习因子,rand()是一个在[0,1]间均匀分布的随机数。

以下是一个简单的粒子群优化算法的Python实现示例:

import numpy as npclass Particle:def __init__(self, dim, minx, maxx):self.position = np.random.uniform(low=minx, high=maxx, size=dim)  # 粒子当前位置self.velocity = np.random.uniform(low=-0.1, high=0.1, size=dim)  # 粒子当前速度self.best_position = np.copy(self.position)  # 粒子历史最优位置class PSO:def __init__(self, dim, pop_size, max_iter, minx, maxx, w=0.8, c1=2, c2=2):self.dim = dim  # 问题的维度self.pop_size = pop_size  # 粒子群大小self.max_iter = max_iter  # 最大迭代次数self.minx = minx  # 搜索空间下界self.maxx = maxx  # 搜索空间上界self.w = w  # 惯性权重self.c1 = c1  # 个体学习因子self.c2 = c2  # 全局学习因子self.gbest = np.inf  # 全局最优解self.gbest_position = np.zeros(dim)  # 全局最优位置self.population = [Particle(dim, minx, maxx) for _ in range(pop_size)]  # 粒子群def optimize(self, function):for iter_count in range(self.max_iter):for particle in self.population:fitness = function(particle.position)  # 计算适应度值if fitness < function(particle.best_position):  # 如果当前适应度值优于历史最优,更新粒子最优解particle.best_position = np.copy(particle.position)if fitness < self.gbest:  # 如果当前适应度值优于全局最优,更新全局最优解self.gbest = fitnessself.gbest_position = np.copy(particle.position)for particle in self.population:  # 更新粒子速度和位置particle.velocity = self.w * particle.velocity + self.c1 * np.random.rand() * (particle.best_position - particle.position) + self.c2 * np.random.rand() * (self.gbest_position - particle.position)particle.position += particle.velocityreturn self.gbest, self.gbest_position

在上述代码中,我们首先定义了一个粒子类,包含粒子的位置、速度和历史最优位置。然后我们定义了一个PSO类,其中包含了优化过程。优化函数接受一个函数作为参数,这个函数应当返回给定位置的适应度值。在每次迭代中,我们遍历所有粒子,评估它们的适应度,并更新粒子和全局的最优解。然后我们根据PSO的速度和位置更新规则来更新每个粒子的速度和位置。

萤火虫算法(Firefly Algorithm,FA)

萤火虫算法是由Yang在2009年提出的一种新型的群体智能优化算法。它是受到自然界中萤火虫闪烁行为的启发,通过模拟萤火虫之间的行为来进行寻优。

在萤火虫算法中,每个萤火虫都是一个潜在的解,它们在搜索空间中随机分布。萤火虫通过互相吸引,朝着亮度更高(在这里等同于适应度更好)的萤火虫移动。移动距离和亮度有关,亮度越高,吸引力越大,移动距离越远。

这个算法的关键是如何定义萤火虫的亮度和吸引力。一般来说,萤火虫的亮度是与其适应度值正相关的,而吸引力则是与两个萤火虫之间的距离和亮度差异有关的。具体的计算公式如下:

萤火虫i的亮度B(i)为:

B(i) = f(x(i))

萤火虫i对j的吸引力beta为:

beta = beta0 * exp(-gamma * r^2)

其中,x(i)表示萤火虫i的位置,f()是适应度函数,r是萤火虫i和j之间的欧氏距离,beta0是初始吸引力,gamma是光强衰减系数。

萤火虫i的位置更新公式为:

x(i) = x(i) + beta * (x(j) - x(i)) + alpha * (rand() - 0.5)

其中,alpha是一个步长因子,rand()是一个在[0,1]间均匀分布的随机数。

下面是一个简单的萤火虫算法的Python实现示例:

import numpy as npclass Firefly:def __init__(self, dim, minx, maxx):self.position = np.random.uniform(low=minx, high=maxx, size=dim)  # 萤火虫当前位置class FA:def __init__(self, dim, pop_size, max_iter, minx, maxx, alpha=0.5, beta0=1, gamma=1):self.dim = dim  # 问题的维度self.pop_size = pop_size  # 萤火虫群大小self.max_iter = max_iter  # 最大迭代次数self.minx = minx  # 搜索空间下界self.maxx = maxx  # 搜索空间上界self.alpha = alpha  # 步长因子self.beta0 = beta0  # 初始吸引力self.gamma = gamma  # 光强衰减系数self.population = [Firefly(dim, minx, maxx) for _ in range(pop_size)]  # 萤火虫群def optimize(self, function):for iter_count in range(self.max_iter):for i in range(self.pop_size):for j in range(self.pop_size):if function(self.population[i].position) > function(self.population[j].position):r = np.linalg.norm(self.population[i].position - self.population[j].position)beta = self.beta0 * np.exp(-self.gamma * r ** 2)self.population[i].position += beta * (self.population[j].position - self.population[i].position) + self.alpha * (np.random.rand(self.dim) - 0.5)return min(self.population, key=lambda firefly: function(firefly.position)).position

在上述代码中,我们首先定义了一个萤火虫类,包含萤火虫的位置。然后我们定义了一个FA类,其中包含了优化过程。优化函数接受一个函数作为参数,这个函数应当返回给定位置的适应度值。在每次迭代中,我们遍历所有萤火虫,根据亮度比较和吸引力计算来更新萤火虫的位置。

布谷鸟搜索(Cuckoo Search,CS)

布谷鸟搜索是Yang和Deb在2009年提出的一种新型群体智能优化算法。它受到了布谷鸟繁殖策略的启发。在自然界中,部分种类的布谷鸟会把自己的蛋产在其他鸟类的巢穴中,并由寄主鸟类孵化。如果寄主发现了布谷鸟的蛋,它会选择扔掉或者 abandon 巢穴并重新建立一个新的巢穴。

在布谷鸟搜索算法中,每个布谷鸟都是一个解,并在搜索空间中随机产生。每个布谷鸟在每次迭代中都会产生一个新的解(蛋),如果新解的质量优于当前解,就用新解替换当前解。此外,一部分差的解会被扔掉,并在搜索空间中随机产生新的解。

以下是布谷鸟搜索算法的一种简单的Python实现:

import numpy as npclass Cuckoo:def __init__(self, dim, minx, maxx):self.position = np.random.uniform(low=minx, high=maxx, size=dim)  # 布谷鸟当前位置class CS:def __init__(self, dim, pop_size, max_iter, minx, maxx, pa=0.25):self.dim = dim  # 问题的维度self.pop_size = pop_size  # 布谷鸟群大小self.max_iter = max_iter  # 最大迭代次数self.minx = minx  # 搜索空间下界self.maxx = maxx  # 搜索空间上界self.pa = pa  # 废弃巢穴的概率self.population = [Cuckoo(dim, minx, maxx) for _ in range(pop_size)]  # 布谷鸟群def optimize(self, function):for iter_count in range(self.max_iter):for i in range(self.pop_size):j = np.random.randint(0, self.pop_size)  # 选择一个布谷鸟jwhile i == j:  # 确保i不等于jj = np.random.randint(0, self.pop_size)new_position = self.population[i].position + np.random.uniform(low=-1, high=1, size=self.dim) * (self.population[i].position - self.population[j].position)  # 生成新的解if function(new_position) < function(self.population[i].position):  # 如果新解优于当前解,替换之self.population[i].position = new_positionfor i in range(self.pop_size):if np.random.rand() < self.pa:  # 按概率pa废弃巢穴并重新生成解self.population[i].position = np.random.uniform(low=self.minx, high=self.maxx, size=self.dim)return min(self.population, key=lambda cuckoo: function(cuckoo.position)).position

在上述代码中,我们首先定义了一个布谷鸟类,包含布谷鸟的位置。然后我们定义了一个CS类,其中包含了优化过程。优化函数接受一个函数作为参数,这个函数应当返回给定位置的适应度值。在每次迭代中,每个布谷鸟会生成新的解并用新解替换旧解(如果新解优于旧解),此外,按照给定的概率废弃巢穴并重新生成解。

蚁群优化(Ant Colony Optimization,ACO)

蚁群优化算法是Dorigo等人在1996年提出的,灵感来源于观察到天然蚂蚁集群寻找食物过程中的行为。蚂蚁们在寻找食物的过程中,会释放一种称为信息素的物质,其浓度可以为其他蚂蚁提供路径选择的依据。这样,经过一段时间,最短的路径上的信息素浓度将会最高,从而所有的蚂蚁都会选择这条路径。

在蚁群优化算法中,每只蚂蚁都是一个解,它们在搜索空间中进行移动,释放信息素。在每次迭代中,每只蚂蚁根据当前位置和信息素分布选择下一个位置,然后更新信息素分布。

以下是蚁群优化算法的一个简单的Python实现:

import numpy as npclass Ant:def __init__(self, num_cities):self.path = np.random.permutation(num_cities)  # 蚂蚁的路径,这里我们假设问题是TSP问题class ACO:def __init__(self, num_cities, pop_size, max_iter, alpha=1, beta=5, rho=0.5, Q=100):self.num_cities = num_cities  # 城市数量self.pop_size = pop_size  # 蚂蚁群大小self.max_iter = max_iter  # 最大迭代次数self.alpha = alpha  # 信息素重要程度self.beta = beta  # 启发式信息重要程度self.rho = rho  # 信息素挥发速度self.Q = Q  # 信息素增量self.population = [Ant(num_cities) for _ in range(pop_size)]  # 蚂蚁群self.pheromone = np.ones((num_cities, num_cities))  # 信息素矩阵self.distance = np.random.uniform(low=1, high=10, size=(num_cities, num_cities))  # 城市间的距离矩阵,这里我们假设距离是随机的for i in range(num_cities):  # 距离矩阵是对称的for j in range(i, num_cities):self.distance[i][j] = self.distance[j][i]def optimize(self):for iter_count in range(self.max_iter):for i in range(self.pop_size):for j in range(self.num_cities - 1):p = (self.pheromone[self.population[i].path[j]][self.population[i].path] ** self.alpha) / (self.distance[self.population[i].path[j]][self.population[i].path] ** self.beta)  # 计算每个城市被选择的概率p = p / np.sum(p)  # 归一化概率next_city = np.random.choice(self.population[i].path, p=p)  # 根据概率选择下一个城市self.population[i].path = np.delete(self.population[i].path, np.argwhere(self.population[i].path == next_city))  # 从未访问城市中删除这个城市self.population[i].path = np.append(self.population[i].path, next_city)  # 将这个城市添加到路径的末尾self.pheromone *= (1 - self.rho)  # 信息素挥发for j in range(self.num_cities - 1):  # 更新信息素self.pheromone[self.population[i].path[j]][self.population[i].path[j + 1]] += self.Q / np.sum(self.distance[self.population[i].path[j]][self.population[i].path[j + 1]])return min(self.population, key=lambda ant: np.sum(self.distance[ant.path[j]][ant.path[(j + 1) % self.num_cities]] for j in range(self.num_cities))).path

在上述代码中,我们首先定义了一个蚂蚁类,包含蚂蚁的路径。然后我们定义了一个ACO类,其中包含了优化过程。在每次迭代中,每只蚂蚁都会根据当前位置和信息素分布选择下一个位置,然后更新信息素分布。

人工蜂群(Artificial Bee Colony,ABC)

人工蜂群算法是Karaboga在2005年提出的一种群体智能优化算法,灵感来源于蜜蜂寻找蜜源的行为。在人工蜂群算法中,蜜蜂被分为三类:工蜂、侦查蜂和跟随蜂。工蜂和侦查蜂负责寻找新的解(蜜源),而跟随蜂则选择一个工蜂并尝试优化其找到的解。同时,若一个解在一段时间内没有得到优化,那么这个解会被放弃,侦查蜂将在搜索空间中随机寻找新的解。

以下是人工蜂群算法的一个简单的Python实现:

import numpy as npclass Bee:def __init__(self, dim, minx, maxx):self.position = np.random.uniform(low=minx, high=maxx, size=dim)  # 蜜蜂当前位置class ABC:def __init__(self, dim, pop_size, max_iter, minx, maxx):self.dim = dim  # 问题的维度self.pop_size = pop_size  # 蜜蜂群大小self.max_iter = max_iter  # 最大迭代次数self.minx = minx  # 搜索空间下界self.maxx = maxx  # 搜索空间上界self.population = [Bee(dim, minx, maxx) for _ in range(pop_size)]  # 蜜蜂群def optimize(self, function):for iter_count in range(self.max_iter):for i in range(self.pop_size // 2):  # 工蜂阶段j = np.random.randint(0, self.pop_size)  # 选择一个蜜蜂jwhile i == j:  # 确保i不等于jj = np.random.randint(0, self.pop_size)new_position = self.population[i].position + np.random.uniform(low=-1, high=1, size=self.dim) * (self.population[i].position - self.population[j].position)  # 生成新的解if function(new_position) < function(self.population[i].position):  # 如果新解优于当前解,替换之self.population[i].position = new_positionfor i in range(self.pop_size // 2, self.pop_size):  # 跟随蜂阶段j = np.random.randint(0, self.pop_size // 2)  # 选择一个工蜂jnew_position = self.population[j].position + np.random.uniform(low=-1, high=1, size=self.dim) * (self.population[j].position - self.population[np.random.randint(0, self.pop_size)].position)  # 生成新的解if function(new_position) < function(self.population[j].position):  # 如果新解优于当前解,替换之self.population[j].position = new_positionreturn min(self.population, key=lambda bee: function(bee.position)).position

在上述代码中,我们首先定义了一个蜜蜂类,包含蜜蜂的位置。然后我们定义了一个ABC类,其中包含了优化过程。在每次迭代中,工蜂和跟随蜂都会生成新的解并用新解替换旧解(如果新解优于旧解)。


到这里,我们已经详细解释了五种Python群体智能优化算法:粒子群优化、萤火虫算法、布谷鸟搜索、蚁群优化和人工蜂群。这些算法各具特色,但都是基于群体行为的启发,它们在解决实际问题,特别是组合优化问题、函数优化问题等方面有着广泛的应用。希望本文能够帮助你对这些算法有更深入的理解,也希望你在实际应用中能够得到满意的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV 入门教程: Sobel算子和Scharr算子

OpenCV 入门教程&#xff1a; Sobel 算子和 Scharr 算子 导语一、Sobel 算子二、Scharr 算子三、示例应用3.1 图像边缘检测3.2 边缘增强 总结 导语 在图像处理和计算机视觉领域&#xff0c;边缘检测是一项重要的任务。 Sobel 算子和 Scharr 算子是两种常用的边缘检测算子&…

MOVEit再现新漏洞,多个版本受影响

今年6月&#xff0c;文件共享工具MOVEit Transfer曾曝出SQL 注入漏洞&#xff0c;能让远程攻击者访问其数据库并执行任意代码。最近&#xff0c;MOVEit Transfer 母公司Progress Software又披露了三个新漏洞。 这三个漏洞分别是 CVE-2023-36932、CVE-2023-36933 和 CVE-2023-36…

云事业群CTO线技术晋升考核机试题-分布式专题-C 分布式任务调度

2023年&#xff08;Q3财年&#xff09;技术部门CTO线技术人员晋升考核机试题 分布式篇-C 分布式任务调度 *参考答案* 出题人&#xff1a;湖北TL田超凡答案制定&#xff1a;湖北TL田超凡 *****试卷启用前绝密**** 1 传统的定时任务存在那些缺点 答&#xff1a;传统定时任务…

window安装MongoDB

安装直接先去官网下载 Download MongoDB Community Server | MongoDB 安装后如下&#xff0c;我们直接双击运行&#xff0c; 这里记得选下面(可以自己选择安装盘符位置)&#xff0c;上面第一个会自动帮你安装到C盘&#xff0c;然后选择下一步 &#xff0c;这里勾选就会选择去自…

win10电脑出现网络问题时,如何解决?

我们的Windows可能会出现各种网络连接问题&#xff1a; 尝试连接Wi-Fi网络时出现错误&#xff1a;Windows无法连接到此网络&#xff1b;可以通过Wifi访问互联网&#xff0c;但通过电缆访问以太网却无法正常工作&#xff1b;尝试通过电缆连接互联网时出现错误&#xff1a; Wind…

MATLAB 之 文件操作

这里写目录标题 一、文件操作1. 文件打开与关闭1.1 fopen 函数1.2 fclose 函数 2. 文件的读写2.1 fscanf 函数2.2 fprintf 函数2.3 fgetl 与 fgets函数2.4 textscan 函数2.5 fread 函数2.6 fwrite 函数 3. 数据文件定位3.1 fseek 函数3.2 ftell 函数3.3 feof 函数3.4 ferror 函…

如何使用chatgpt写文章

最近&#xff0c;我身边的朋友都在说ChatGPT&#xff0c;说它是写作的神器&#xff0c;能够帮助他们创作出优质的文章。也许有些人会感到迷惑&#xff0c;什么是ChatGPT&#xff1f;如何使用它来写文章呢&#xff1f; 今天&#xff0c;我将为你揭秘一切&#xff01;不仅提供详…

NXP i.MX 6ULL工业开发板硬件说明书( ARM Cortex-A7,主频792MHz)

前 言 本文档主要介绍TLIMX6U-EVM评估板硬件接口资源以及设计注意事项等内容。 创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的评估板&#xff0c;由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证&#xff0c;稳…

基于Springboot+vue的垃圾分类网站设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

Linux下软件安装的命令

源码安装 以源代码安装软件&#xff0c;每次都需要配置操作系统、配置编译参数、实际编译&#xff0c;最后还要依据个人喜好的方式来安装软件。这个过程很麻烦很累人。 RPM安装软件的默认路径: 注意&#xff1a; /etc 配置文件放置目录/usr/bin 一些可执行文件/usr/lib 一些程…

星辰秘典:探索Python项目的神秘力量——贪吃蛇

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;星辰秘典&#xff1a;探索Python项目的神秘力量 &#x1f433;专栏&#xff1a;web开发&#xff08;html css js&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主…

Flutter GetX使用

下载地址&#xff1a; https://pub-web.flutter-io.cn/packages/get 导入依赖&#xff1a; dependencies:get: ^4.6.5导入头文件&#xff1a; import package:get/get.dart;使用 Obx() 、 GetX<T>() 创建全局数据 Counter&#xff0c;继承 GetxController&#xff1a…

JAVA - equal 和 == 等号比较

号 号比较的是栈中的数据 可以用于基本数据类型和引用类型 对于基本数据类型&#xff0c;数据存储在栈中&#xff0c;因此判断的是值是否相同 对于引用数据类型&#xff0c;栈中存储的是对象在堆中的引用地址&#xff0c;因此比较的是对象在栈中保存的引用&#xff08;地址&a…

基于SpringBoot+Hadoop+Vue的企业网盘系统

完整资料进入【数字空间】查看——baidu搜索"writebug" 1.1.1 选题的背景 随着信息网络技术的迅猛发展&#xff0c;云计算技术从它的概念提出已经开始在实际生产环境中使用了。大部分的东西都已经慢慢云端化&#xff0c;这种新型的技术也受到许多互联网人员的关注&a…

ARM CORETEX M0简介

ARM CORETEX M0简介 1. M0处理器简单框图 处理器内核&#xff1a;逻辑控制与运算 内部总线系统&#xff1a;单总线将处理器与外部的存储器和外部连接&#xff0c;进行数据交互&#xff08;冯诺依曼架构&#xff0c;数据与指令一起&#xff09; NVIC&#xff1a;嵌套向量中断控…

RabbitMQ部署

文章目录 RabbitMQ部署指南1.单机部署1.1.下载镜像1.2.安装MQ RabbitMQ部署指南 RabbitMQ是基于Erlang语言开发的开源消息通信中间件&#xff0c;官网地址&#xff1a;https://www.rabbitmq.com Erlang语言: 面向并发的编程语言&#xff0c;天生为了分布式系统而设计的 1.单机…

好用的网址6

PPT课件网&#xff1a;http://www.pptkj.net/ ImgUpscaler&#xff1a;AI Image Upscaler - Upscale Photo, Cartoons in Batch Free 加强图片 AI Draw&#xff1a;AI Draw | Convert Images to One-Line Drawings with AI ZToDoList&#xff1a;https://www.ztodolis…

elementUI 表格页面层级嵌套过多不及时刷新/错位的解决办法

1.强制刷新(可能会影响性能) //(嵌套过深需要强制刷新数据) forceUpdate() {this.$forceUpdate(); }, 2.页面重新布局(适用于表格错位等问题) 前提需要绑定: <el-form ref"table"></el-form> this.$refs["table"][0].doLayout(); //重新布局

124. 二叉树中的最大路径和

二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root &#xff0c…

JavaScript--改变 HTML 的值

要改变 HTML 元素的值&#xff0c;可以使用以下方法&#xff1a; 1.使用元素节点的 innerText 属性来改变元素的文本内容。 例如&#xff1a;element.innerText 新的文本内容; 2.使用元素节点的 innerHTML 属性来改变元素的 HTML 内容。 例如&#xff1a;element.innerHTML …