【数模/启发式算法】蚁群算法

news/2024/4/27 20:06:26/文章来源:https://blog.csdn.net/qq_55799677/article/details/126323980

文章目录

      • 简介
      • 符号说明
      • 核心思想
      • 流程图
      • 文章使用到的测试函数
      • 基本步骤
      • 蚁群算法代码

简介

 蚁群算法是一种用来寻找优化路径的概率型算法。它由Marco Dorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。

 这种算法具有分布计算、信息正反馈和启发式搜索的特征,本质上是进化算法中的一种启发式全局优化算法。

符号说明

符号含义
nnn蚂蚁个数
ρ\rhoρ信息素挥发系数,通常取0.9
P0P0P0转移概率常数,通常取0.8
pheroidphero^{d}_{i}pheroid第d次迭代,第i只蚂蚁的信息素浓度
pip_{i}pi第i只蚂蚁的转移概率

核心思想

 单个蚂蚁的行为比较简单,但是蚁群整体却可以体现一些智能的行为。例如蚁群可以在不同的环境下,寻找最短到达食物源的路径。这是因为蚂蚁会在其经过的路径上释放一种可以称之为“信息素”的物质,蚁群内的蚂蚁对“信息素”具有感知能力,它们会沿着“信息素”浓度较高路径行走,而每只路过的蚂蚁都会在路上留下“信息素”,这就形成一种类似正反馈的机制,这样经过一段时间后,整个蚁群就会沿着最短路径到达食物源了。

流程图

在这里插入图片描述

文章使用到的测试函数

一元函数:y=abs(xsin(x)cos(2x)−2xsin(3x)+3xsin(4x)),x∈[0,50]y = abs(xsin(x)cos(2x)-2xsin(3x)+3xsin(4x)), \ \ \ x \in [0, 50]y=abs(xsin(x)cos(2x)2xsin(3x)+3xsin(4x)),   x[0,50]参考最大值为:max(y)=219.501max(y) = 219.501max(y)=219.501
在这里插入图片描述

二元函数:y=−(x12+x22−x1x2−10x1−4x2+60)y = -(x_{1}^{2}+x_{2}^{2}-x_{1}x_{2}-10x_{1}-4x_{2}+60)y=(x12+x22x1x210x14x2+60)参考最大值为:max(y)=−8.0max(y) = -8.0max(y)=8.0
在这里插入图片描述

基本步骤

 对于简单的函数求解最值的问题,蚁群算法的的基本操作可以分为三步:
(1)根据信息素浓度计算蚂蚁的转移概率。信息素浓度越大,转移概率越高。计算转移概率的方式:Pi=pheroi/max(phero0,phero1,...,pheron)P_{i} = phero_{i} / max(phero_{0}, phero_{1},...,phero_{n})Pi=pheroi/max(phero0,phero1,...,pheron)

(2)根据转移概率判断蚂蚁的搜索方式(转移方式)。转移概率大于一个转移概率常数时说明此只蚂蚁距离最优解较近,需要进行局部搜索;反之需要进行全局搜索。

(3)更新信息素浓度。pheroid+1=ρpheroid+newpherophero^{d+1}_{i} = \rho \ phero^{d}_{i} + newpheropheroid+1=ρ pheroid+newphero其中,newpheronewpheronewphero使用当前蚂蚁的适应度计算。

注意:信息素应为非负值,因为需要通过挥发系数来达到挥发(衰减)的目的。使用调整函数调整信息素取值。调整方式为:如果出现了信息素负值则每一只蚂蚁的信息素+最小值的相反数;否则什么也不用做。

def adjust(self, phero_val):# 调整所有值非负, 为了保证信息素正常衰减min_val = min(phero_val)if min_val < 0:min_val = -min_valfor i in range(self.n):phero_val[i] += min_val

蚁群算法代码

Python版本:

import random
from copy import deepcopy
import mathdef func(x):# 一元函数测试return abs(x[0] * math.sin(x[0]) * math.cos(2 * x[0]) - 2 * x[0] * math.sin(3 * x[0]) + 3 * x[0] * math.sin(4 * x[0]))# # 二元函数测试# return -(x[0]**2 + x[1]**2 - x[0]*x[1] - 10 * x[0] - 4 * x[1] + 60)class ACO:def __init__(self, func, n = 300, var = 1, iter = 50, lb = None, ub = None):""" 默认寻找最大值,以及对应自变量取值。 若需要寻找最大值,对目标函数乘-1,并对最终结果乘-1即可:param func: type:函数, des:所要求解的目标函数:param n: type: int, des: 蚁群蚂蚁的个数:param var: type: int, des: 函数中自变量的个数,即:几元函数:param iter: type: int, des: 迭代次数:param lb: type: list(double), des: 每一种自变量的下界,注意应和自变量一一对应:param ub: type: list(double), des: 每一种自变量的上界,注意应和自变量一一对应"""if lb is None:lb = []if ub is None:ub = []# 目标函数self.func = func# 初始化蚂蚁数量self.n = n# 初始化自变量个数self.var = var# 初始化迭代次数self.iter = iter# 初始化自变量范围 len(lb) = len(ub) = varself.lb = lbself.ub = ub# 初始化信息素挥发系数self.Rou = 0.9# 初始化转移概率常数self.P0 = 0.8# 为每只蚂蚁的适应度申请空间## 每只蚂蚁的信息素浓度。 取值与适应度(一般为函数值)有关self.phero = [0] * n# 为每只蚂蚁的坐标申请空间。 注意:多元函数需要var个自变量来描述self.ant = [[0] * var for _ in range(n)]## 初始化每只蚂蚁的坐标for i in range(n): # n只蚂蚁for j in range(var):# 使个自变量随机分布于可行域中self.ant[i][j] = lb[j] + random.random() * (ub[j] - lb[j])# 计算一组初始解self.phero[i] = self.func(self.ant[i])# 最优解位置self.x = deepcopy(self.ant[0])# 初始化最优解位置for i in range(1, n):# 基于最大值选择最优值if self.phero[i] > self.func(self.x):self.x = deepcopy(self.ant[i])def adjust(self, phero_val):# 调整所有值非负, 为了保证信息素正常衰减min_val = min(phero_val)if min_val < 0:min_val = -min_valfor i in range(self.n):phero_val[i] += min_valdef run(self):# 预处理适应度(信息素)非负self.adjust(self.phero)for k in range(1, self.iter + 1):# 局部搜索步长## 随迭代次数增加步长逐渐减小step = 1 / k# 每只蚂蚁的转移概率p = [0] * self.n## 信息素越多, 转移概率越大for i in range(self.n):p[i] = self.phero[i] / max(self.phero)new_phero= [0] * self.nfor i in range(self.n):for j in range(self.var):if p[i] >= self.P0: # 局部搜索# rand - 0.5 为了均匀产生正负位移self.ant[i][j] += (random.random() - 0.5) * stepelse: # 全局搜索# rand - 0.5 为了均匀产生正负位移self.ant[i][j] += (random.random() - 0.5) * (self.ub[j] - self.lb[j])# 调整自变量值避免越界if self.ant[i][j] < self.lb[j]:self.ant[i][j] = self.lb[j]if self.ant[i][j] > self.ub[j]:self.ant[i][j] = self.ub[j]# 更新最优值位置if self.func(self.ant[i]) > self.func(self.x):self.x = deepcopy(self.ant[i])new_phero[i] = self.func(self.ant[i])self.adjust(new_phero)for i in range(self.n):self.phero[i] = (1 - self.Rou) * self.phero[i] + new_phero[i]print(f'最优解为:{self.func(self.x)}')print(f'最优解对应自变量取值为:{self.x}')"""一元函数测试"""
aco = ACO(func, 50, 1, 100, [0], [50])"""二元函数测试"""
# aco = ACO(func, 50, 2, 100, [-15, -15], [15, 15])aco.run()

以一元函数测试为例,对应输出为:

最优解为:219.52583163372353
最优解对应自变量取值为:[47.554148304588374]

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

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

相关文章

Arduino播放声音

玩软件有点虚无&#xff0c;没有实际东西&#xff0c;所以接下来要体验下硬件与软件结合。 1 Arduino Arduino是一种包含硬件&#xff08;各种型号的Arduino板&#xff09;和软件&#xff08;Arduino IDE&#xff09;的开源电子平台。硬件部分是可以用来做电路连接的Arduino电…

小白学习Java第四十三天

Git概述 &#xff08;一&#xff09;什么是Git Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理&#xff0c;是软件配置管理的核心思想之一…

设计模式学习笔记(五) - 观察者模式 Observer

目录 观察者模式 Observer 一、背景描述 Version 1 (面向过程) Version 2 (面向对象) Version 3 (单个观察者) Version 4 (多个观察者) Version 5 (分离观察者与被观察者) 二、不同事件下的观察者模式 三、事件本身也可以形成继承体系 四、观察者常用场景 观察者模式…

Selenium基础 — 鼠标操作

1、鼠标事件介绍 前面例子中我们已经学习到可以用click()来模拟鼠标的单击操作&#xff0c;而我们在实际的web产品测试中发现&#xff0c;有关鼠标的操作&#xff0c;不单单只有单击&#xff0c;有时候还要用到右击&#xff0c;双击&#xff0c;拖动等操作&#xff0c;这些操作…

【Nginx】认识与基本使用 Nginx 实现反向代理、配置负载均衡

文章目录1. Nginx 概述1.1 Nginx 介绍1.2 Nginx 下载和安装1.3 Nginx 目录结构2. Nginx 命令3. Nginx 配置文件结构4. Nginx 具体应用4.1 部署静态资源4.2 反向代理4.2.1 介绍4.2.2 配置反向代理4.3 负载均衡4.3.1 介绍4.3.2 配置负载均衡4.3.3 负载均衡策略1. Nginx 概述 1.1…

Ubuntu开机界面出现“error found when loading /root/.profile”

原因 今天一开始按照一篇文章&#xff0c;想把普通用户的权限提高到最高权限&#xff0c;修改了**/etc/passwd**文件&#xff0c;然后重启&#xff0c;发现之前的用户进不去了&#xff0c;一开机就出现如下信息 解决方法 1、重启虚拟机进入recovery模式&#xff08;长按shi…

计算机网络-第一章 | 王道考研

目录 一、基本介绍 定义 功能 组成 分类 标准化工作 标准的分类 标准化工作相关组织 二、性能指标 ※ 速率 带宽 ※吞吐量 时延 时延带宽积 往返时延RTT 利用率 三、分层结构 ※ 分层基本规则 正式认识分层 7层OSI参考模型 怎么来的 怎么分的 怎么传的…

<特殊类设计与单例模式>——《C++高阶》

目录 1.请设计一个类&#xff0c;不能被拷贝 2. 请设计一个类&#xff0c;只能在堆上创建对象 3. 请设计一个类&#xff0c;只能在栈上创建对象 4. 请设计一个类&#xff0c;不能被继承 5. 请设计一个类&#xff0c;只能创建一个对象(单例模式) 后记&#xff1a;●由于…

GD32F307VC+WIN10+VSCODE+GCC+JLINK环境build

为了构建Cortex M系列单片机免费开源的开发环境&#xff0c;网络上了解来看VSCODEGCCJLINK是一套比较高效的组合方式&#xff0c;下面记录环境搭建的流程。 我这边的PC环境为 WIN10专业版64bit。 工具准备 1. arm-none-eabi-gcc下载及安装 官网下载链接&#xff1a;Downloa…

c++数据结构:数组和向量

线性表&#xff1a; 在数据元素的非空有限集中 存在唯一的一个被叫做“第一个”的数据元素存在唯一的一个被叫做“最后一个”的数据元素除第一个之外&#xff0c;集合中的每个数据元素均只有一个前驱除最后一个之外&#xff0c;每个集合元素均只有一个后继数据结构中线性结构指…

文字识别检测入门(1)

CTPN 优点&#xff1a;对水平文字检测效果超级好 缺点&#xff1a;对扭曲的文字不好 RRPN 在faster的基础上改进 RPN改为RRPN ROI pooling改进为RROI pooling 能解决旋转&#xff0c;但是解决不了弯曲的曲面问题 EAST Anchor free 特征合并&#xff0c;检测不同尺度文本 检测各…

刷爆leetcode第三期 0007~0010

刷爆leetcode第三期 0007~0010 题目一 反转链表解法一解法二题目二 链表的中间节点题目三 链表的倒数第K个节点题目四 合并两个有序链表题目一 反转链表 解法一 给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a…

python与人工智能:线性回归和逻辑回归

线性回归 线性回归是利用数理统计中回归分析&#xff0c;来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法&#xff0c;运用 十分广泛。梯度下降&#xff1f; 梯度下降法的基本思想可以类比为一个下山的过程。 假设这样一个场景&#xff1a;一个人被困在山上&a…

零拷贝总结

数据交互模式 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dqLJVb5U-1665401648551)(en-resource://database/1074:1)] 读数据过程&#xff1a; 应用程序要读取磁盘数据&#xff0c;调用 read()函数从而实现用户态切换内核态&#xff0c;这是第 …

论文/机器学习笔记:SENet (Squeeze-and-Excitation Networks)

Image 2017 挑战赛夺冠paper 1 motivation 希望显式地建模特征通道&#xff08;channel&#xff09;之间的相互依赖关系 通过学习的方式来自动获取到每个特征通道的重要程度依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征 2 模型 给定一个输入 x&#xff…

利用phpstudy导入mysql文件

1.创建mysql文件 mysql 常用命令&#xff1a; 打开mysql: mysql -u root -p 查看数据库&#xff1a; show databases; 创建 数据库: create database baseName (数据库名称) 使用数据库&#xff1a; use baseName(数据库名称) 显示表&#xff1a;show tables; 创建表&#xff…

C#【高级篇】 IntPtr是什么?怎么用?

C#学习汇总 - 总目录 C#【高级篇】 IntPtr是什么&#xff1f;怎么用&#xff1f;前言一、IntPtr&#xff08;IntPointer&#xff09;的由来二、IntPtr&#xff08;属于结构体&#xff09;的说明三、IntPtr的使用示例1、int类型与IntPtr类型之间的转换2、string类型与IntPtr之间…

Java collection集合的体系特点

Java collection集合的体系特点 集合类体系结构 collection单列集合&#xff0c;每个元素&#xff08;数据&#xff09;只包含一个值。 Map双列集合&#xff0c;每个元素包含两个值&#xff08;键值对&#xff09;。 collection集合体系&#xff08;常见&#xff09; colle…

位段是什么玩意?你听说过吗??

当我们学完结构体之后&#xff0c;我们就要好好学学结构体实现位段的能力&#xff01;&#xff01;&#xff01; 目录 一、位段是什么&#xff1f; 二、位段的内存分配 三、位段的跨平台问题 总结 一、位段是什么&#xff1f; 位段的声明和结构体大体相同&#xff0c;但是有两…

【Unity_AssetBundle】(二)AB包资源打包、Asset Bundle Browser工具的使用

1.Asset Bundle Browser包安装 Asset Bundle Browser是AB包打包工具较底版本Unity编辑器&#xff1a; Windows——>Package Mannger——>搜索Asset Bundle Browser进行下载导入即可 较高版本Unity编辑器&#xff1a; 高版本Unity在Addressables功能中封装了AB包功能 安…