蚁群算法求解TSP问题

一、基本原理

一只蚂蚁从一个城市出发,在访问其他城市时留下信息素踪迹。其他蚂蚁沿着这些踪迹并开辟自己的路径。信息素在访问频率较高的路径上积累得更密集,这种密度增加了其他蚂蚁选择该路径的可能性。


import randomdistances = [[0, 2, 5, 7],[2, 0, 6, 3],[5, 6, 0, 8],[7, 3, 8, 0]
]numAnts = 5
numCities = 4
maxIterations = 100 //最大迭代次数
evaporationRate = 0.5 //表示信息素的挥发率。
alpha = 1.0
beta = 2.0 //计算选择下一个城市概率的参数pheromones = []
//初始化信息素矩阵,初始值都为 1.0
def initialize_pheromones():global pheromonespheromones = [[1.0] * numCities for _ in range(numCities)]
//生成一只蚂蚁的行走路径。它随机选择一个起始城市,然后根据信息素和距离的启发式信息选择下一个未访问的城市,直到访问完所有城市。
def generate_ant_path():path = []visited = [False] * numCitiesstart = random.randint(0, numCities - 1)current = startpath.append(current)visited[current] = Truewhile len(path) < numCities:next_city = select_next_city(current, visited)path.append(next_city)visited[next_city] = Truecurrent = next_cityreturn path
//根据当前城市、已访问状态、信息素和距离启发式信息计算选择下一个城市的概率,并根据随机数确定选择的城市。
def select_next_city(current, visited):probabilities = []total = 0.0for city in range(numCities):if not visited[city]:pheromone = pheromones[current][city]distance = distances[current][city]heuristic = 1.0 / distanceprobability = pheromone ** alpha * heuristic ** betaprobabilities.append((city, probability))total += probabilityprobabilities = [(city, probability / total) for city, probability in probabilities]probabilities.sort(key=lambda x: x[1], reverse=True)cumulative_prob = 0.0random_value = random.random()for city, probability in probabilities:cumulative_prob += probabilityif random_value <= cumulative_prob:return city
//根据蚂蚁走过的路径增加相应路径上的信息素。
def update_pheromones(path):for i in range(numCities - 1):city1 = path[i]city2 = path[i + 1]pheromones[city1][city2] += 1.0 / distances[city1][city2]
// 对信息素进行挥发。
def evaporate_pheromones():for i in range(numCities):for j in range(numCities):pheromones[i][j] *= (1.0 - evaporationRate)
// 在每次迭代中生成蚂蚁的路径,更新信息素,挥发信息素,并记录每次迭代的最佳路径。
def main():initialize_pheromones()for iteration in range(maxIterations):antPaths = []for ant in range(numAnts):path = generate_ant_path()antPaths.append(path)update_pheromones(path)evaporate_pheromones()bestPath = antPaths[0]print(f"Iteration {iteration + 1}: Best Path -> {' -> '.join(map(str, bestPath))}")if __name__ == '__main__':main()

在没有蒸发的情况下:

局部最优问题:信息素路径不断增加,使得特定路径极其强大。这可能会导致算法不断探索这条路径,而忽略其他可能的更好解决方案。

灵活性较差:发现新途径可能会变得困难。蒸发通过减少不太喜欢的路径的信息素痕迹来鼓励新路径的发现。缺乏蒸发可能会导致算法卡在现有路径上。

解决方案达到平衡:蒸发使算法保持平衡。如果没有蒸发,信息素痕迹可能会导致一定的不平衡并导致溶液整体质量的下降。

改进后:

import random
import mathdistances = [[0, 2, 5, 7],[2, 0, 6, 3],[5, 6, 0, 8],[7, 3, 8, 0]
]numAnts = 5
numCities = 4
maxIterations = 100
evaporationRate = 0.5
alpha = 1.0
beta = 2.0pheromones = []def main():random.seed()initialize_pheromones()for iter in range(maxIterations):antPaths = []for ant in range(numAnts):path = generate_ant_path()antPaths.append(path)update_pheromones(path)evaporate_pheromones()bestPath = antPaths[0]print(f"Iteration {iter + 1}: Best Path -> {' -> '.join(map(str, bestPath))}")def initialize_pheromones():global pheromonespheromones = [[1.0] * numCities for _ in range(numCities)]def generate_ant_path():startCity = 0path = [startCity]while len(path) < numCities:currentCity = path[-1]nextCity = choose_next_city(currentCity, path)path.append(nextCity)return pathdef choose_next_city(currentCity, path):availableCities = [city for city in range(numCities) if city not in path]probabilities = []totalProbability = 0.0for nextCity in availableCities:pheromone = math.pow(pheromones[currentCity][nextCity], alpha)distance = 1.0 / distances[currentCity][nextCity]probability = pheromone * distanceprobabilities.append(probability)totalProbability += probabilityprobabilities = [probability / totalProbability for probability in probabilities]randomValue = random.random()cumulativeProbability = 0.0for i, probability in enumerate(probabilities):cumulativeProbability += probabilityif randomValue <= cumulativeProbability:return availableCities[i]return availableCities[-1]def update_pheromones(path):pheromoneDeposit = 1.0for i in range(len(path) - 1):currentCity = path[i]nextCity = path[i + 1]pheromones[currentCity][nextCity] += pheromoneDepositpheromones[nextCity][currentCity] += pheromoneDepositdef evaporate_pheromones():for i in range(numCities):for j in range(numCities):pheromones[i][j] *= (1.0 - evaporationRate)if __name__ == '__main__':main()

二、优点:

灵活性和适用性:它提供了广泛的应用,能够适应不同的问题。它可用于旅游供应商、路线优化等许多领域。

分布式并行结构:蚁群算法基于多只蚂蚁的同时处理来解决问题。这种分布式结构可以更快地解决大型问题。

高改进潜力:该算法使用信息素踪迹来强化最佳路径并让其他蚂蚁跟随它们。这样,在给定的时间内改进的潜力就很大。

自然并行处理:蚂蚁通过相互跟随来解决问题的过程自然地并行进行,这可以减少计算时间。

三、缺点:

局部最优问题:在某些情况下,它可能会关注较短的路径而不是最佳路径。在这种情况下,算法可能会陷入局部最优。

参数灵敏度:算法使用的参数(信息素更新率、跟踪强度等)会影响性能。选择正确的参数很重要。

收敛速度慢:对于大问题或者复杂问题,算法的收敛速度可能会很慢。

最初的性能不佳:最初,信息素追踪可能无效,算法可能很难发现正确的路径。

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

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

相关文章

权限字符串的结构

权限字符串在Unix和Linux文件系统中用于表示文件和目录的访问权限,通常由ls -l命令生成的输出中看到,权限字符串由10个字符组成 ,其结构如下: 文件类型字符 用户权限 组权限 其他用户权限 [1] [2-4] [5-7] [8-10]1. 文件类型字符 -&#xff1a;普通文件 (R…

FFmpeg 系列

&#x1f4da; 此篇文章是先引入ffmpeg的概念以及主要的功能&#xff0c;后面会根据每一个特点进行详解&#xff0c;喜欢ffmpeg的可以持续关注。 ffmpeg是什么&#xff1f; FFmpeg 是一个开源的跨平台音视频处理工具&#xff0c;它可以用来录制、转换以及流化音视频内容。具体…

Trex测试仪使用

公司测试仪器紧张&#xff0c;打算安装Trex做简单的测试。如下下载最新的trex工程。 rztrex:~$ sudo mkdir /opt/trex rztrex:~$ cd /opt/trex/ rztrex:/opt/trex$ rztrex:/opt/trex$ sudo wget --no-cache https://trex-tgn.cisco.com/trex/release/latest --no-check-certif…

antd内容超过固定长度就显示...,鼠标移入则显示提示

结合antd的Tooltip组件&#xff0c;如果内容超过固定长度就显示…&#xff0c;鼠标移入则显示提示 /*** 结合antd的Tooltip组件&#xff0c;如果内容超过固定长度就显示...&#xff0c;鼠标移入则显示提示* param param0* returns*/ const EllipsisText ({ text }) > {con…

前端项目vue3/React使用pako库解压缩后端返回gzip数据

pako仓库地址&#xff1a;https://github.com/nodeca/pako 文档地址&#xff1a;pako 2.1.0 API documentation 外部接口返回一个直播消息或者图片数据是经过zip压缩的&#xff0c;前端需要把这个数据解压缩之后才可以使用&#xff0c;这样可以大大降低网络数据传输的内容&…

解决qiankun项目与子应用样式混乱问题

背景 qiankun项目用的是Vue2Antdesign2&#xff0c;但其中一个子应用用的是Vue3Antdesign4。集成之后发现子应用的样式混乱&#xff0c;渲染的是Antdesign2的样式。 解决 以下步骤在子应用里操作 1. 在main.js引入ConfigProvider &#xff0c;在app全局注册ConfigProvider …

【异常错误】归一化导致的图像生成颜色偏差

由于归一化的问题&#xff0c;会导致生成的图像颜色偏差严重&#xff0c;例如会导致生成的颜色偏红黑色、淡色、青色.. 如果你生成的图像整体感官上没有问题&#xff0c;但是却在颜色上有很大偏差&#xff0c;那么很大可能就是你训练的时候归一化的程序不对 ImageFolder的实现…

Depth Anything V1,V2论文解读

Depth Anything 引言Depth Anything V1标注方法学习标注图像发挥未标注图像的潜力语义辅助感知 Depth Anything V2总体框架流程 引言 在深度估计领域&#xff0c;单目深度估计&#xff08;Monocular Depth Estimation&#xff0c;MDE&#xff09;是指利用单个摄像头拍摄的图像…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十八)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 28 节&#xff09; P28《27.网络连接-Http请求数据》 案例&#xff1a; 这里不懂后端假设服务器的前端小伙伴就需要课程源码资料了…

深度之眼(二十五)——研究生学习计划安排

文章目录 一、前言二、结构安排和规划2.1 夯实基础2.2 分方向训练&#xff08;待&#xff09;2.3 进阶训练 三、其他 一、前言 课题组这边是需要对机器视觉有所要求吧&#xff0c;也就是CV方向。这一届研三师兄也都是在大厂拿到30W的年薪了&#xff0c;也是需要拥抱深度学习这…

java收徒 java辅导 java试用期辅导 java零基础学习

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末报名辅导&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还有大家…

守护变电箱消防安全,全氟己酮自动灭火片该安装在哪个位置?

变电箱、配电柜、换电柜是电力设备的重要组成部分&#xff0c;安全性至关重要。但在使用过程中&#xff0c;容易受到电气、机械、环境等因素影响&#xff0c;出现接触不良、短路、漏电等安全隐患&#xff0c;从而引发火灾事故。为了及时防范火灾风险&#xff0c;提前安装一款能…

【LeetCode】每日一题:数组中的第K大的元素

给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 解题思路 第一种是快排&#xff0c;快…

Vue中数组的【响应式】操作

在 Vue.js 中&#xff0c;当你修改数组时&#xff0c;Vue 不能检测到以下变动的数组&#xff1a; 当你利用索引直接设置一个项时&#xff0c;例如&#xff1a;vm.items[indexOfItem] newValue当你修改数组的长度时&#xff0c;例如&#xff1a;vm.items.length newLength 为…

网卡基础命令

使用 nmcli 可以执行各种网络管理任务&#xff0c;包括重新加载连接配置、重启网卡以及关闭和启用网卡。以下是一些常见的基础命令及其用途&#xff1a; 重新加载连接配置 sudo nmcli connection reload 重新加载所有网络连接的配置文件。 重启网卡&#xff08;网络设备&#x…

Java基础(二)——数组,方法,方法重载

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

01_02_Mybatis的配置文件与基于XML的使用

1、引入日志 在这里我们引入SLF4J的日志门面&#xff0c;使用logback的具体日志实现&#xff1b;引入相关依赖&#xff1a; <!--日志的依赖--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version&g…

从命令行管理文件——软连接,软硬连接的区别

软连接 1. 原理 软连接本质是一种符号连接&#xff0c;类似于 Windows 的快捷方式&#xff0c;存储对应文件的路劲 2. 格式 ln -s 源文件 软连接名称 例&#xff1a; [rootserver /] # cd ~ [rootserver ~] # echo "china" > h1.txt [rootserver ~] # ln…

2024国内外音频转换器大盘点,盘点音乐剪辑的7个有效方法!

当遇到不支持的音乐文件时&#xff0c;您可能就会想要拥有一款优秀的音频转换器。当您想减小大量音乐文件以节省设备存储空间时&#xff0c;它也可以很好地帮上忙。如果您正在寻找这么一款音频转换器&#xff0c;那么&#xff0c;请不要错过这篇文章。一款顶尖的音频转换器不仅…

Oracle day10

create table category( 类目id number, 父类目id number, 描述 char(500) ) --insert into category(类目id,父类目id) values(1001,1); /*insert into category values(1,0,0为根类目); insert into category(类目id,父类目id) values(1002,2); …