当前位置: 首页 > news >正文

数学建模——启发式算法(蚁群算法)

算法原理

        蚁群算法来自于蚂蚁寻找食物过程中发现路径的行为。蚂蚁并没有视觉却可以寻找到食物,这得益于蚂蚁分泌的信息素,蚂蚁之间相互独立,彼此之间通过信息素进行交流, 从而实现群体行为。

        蚁群算法的基本原理就是蚂蚁觅食的过程。首先,蚂蚁在觅食的过程中会在路径上留下信息素(pheromone),并在寻找食物的过程中感知这种物质的强度,并指导自己的行为方向,他们总会朝着浓度高的方向前进。因此可以看得出来,蚂蚁觅食的过程是一个正反馈的过程,该路段经过的蚂蚁越多,信息素留下的就越多,浓度越高,更多的蚂蚁都会选择这个路段。

 

运行实例

例题 (用蚁群算法解决旅行商问题)

        假设有一个旅行商需要从城市1出发,经过若干个城市,最后回到城市1。已知城市之间的距离矩阵,旅行商的目标是最小化经过所有城市的总距离。请使用蚁群算法求解该问题。

  1. 问题定义

    • 假设有n个城市,城市之间的距离矩阵为D,其中D[i][j]表示城市i到城市j的距离。
  2. 初始化参数

    • 蚂蚁数量:m
    • 信息素重要程度因子:alpha
    • 启发函数重要程度因子:beta
    • 信息素蒸发系数:rho
    • 信息素增强系数:Q
    • 最大迭代次数:iter_max
  3. 算法步骤

    • 初始化信息素矩阵tau,所有元素设为相同值。
    • 迭代过程:
      • 每只蚂蚁根据概率选择下一个城市,概率计算公式为:

      • 更新路径和距离
      • 更新信息素矩阵

      • 重复迭代直到满足停止条件

 代码示例

import numpy as np
import random# 初始化参数
n = 10  # 城市数量
m = 50  # 蚂蚁数量
alpha = 1  # 信息素重要程度因子
beta = 5  # 启发函数重要程度因子
rho = 0.1  # 信息素蒸发系数
Q = 100  # 信息素增强系数
iter_max = 200  # 最大迭代次数# 生成距离矩阵
D = np.random.rand(n, n)
D = (D + D.T) / 2  # 确保距离矩阵是对称的
for i in range(n):D[i][i] = np.inf  # 对角线元素设为无穷大# 初始化信息素矩阵
tau = np.ones((n, n))# 启发函数矩阵
eta = 1.0 / (D + np.eye(n))# 存储最佳路径
best_length = np.inf
best_path = []# 迭代过程
for iter in range(iter_max):# 存储每只蚂蚁的路径和距离paths = []lengths = []for i in range(m):path = []length = 0visited = np.zeros(n)  # 标记已访问城市start = random.randint(0, n-1)  # 随机选择起始城市visited[start] = 1path.append(start)for j in range(n-1):tabu = path  # 禁忌表allow_list = [index for index in range(n) if index not in tabu]  # 可访问城市列表P = np.zeros(len(allow_list))  # 计算概率# 计算转移概率for k in range(len(allow_list)):P[k] = np.power(tau[start][allow_list[k]], alpha) * np.power(eta[start][allow_list[k]], beta)P = P / P.sum()# 轮盘赌选择下一个城市next_city = allow_list[np.random.choice(range(len(allow_list)), p=P)]path.append(next_city)length += D[start][next_city]start = next_city# 回到起始城市length += D[start][path[0]]paths.append(path)lengths.append(length)# 更新最佳路径if length < best_length:best_length = lengthbest_path = path# 更新信息素矩阵delta_tau = np.zeros((n, n))for i in range(m):for j in range(n - 1):delta_tau[paths[i][j]][paths[i][j + 1]] += Q / lengths[i]delta_tau[paths[i][-1]][paths[i][0]] += Q / lengths[i]tau = (1 - rho) * tau + delta_tau# 输出结果print("最佳路径长度:", best_length)print("最佳路径:", best_path)

        以上代码实现了基本的蚁群算法求解TSP问题。代码中,我们首先初始化了参数,并生成了城市之间的距离矩阵。然后,我们通过迭代过程让蚂蚁在每一轮中根据信息素和启发函数选择下一个城市,并记录每只蚂蚁的路径和路径长度。在每一轮迭代结束后,我们更新信息素矩阵,并记录下目前为止找到的最短路径。

        需要注意的是,代码中的一些参数(如蚂蚁数量、信息素蒸发系数等)可以根据实际情况进行调整以获得更好的性能。此外,由于使用了随机数生成器,每次运行代码得到的结果可能有所不同。

        最后,代码输出了最佳路径长度和路径。这只是一个简单的例子,蚁群算法可以应用于更复杂的问题,并且可以通过各种方式改进算法的性能。

结果展示

相关文章:

数学建模——启发式算法(蚁群算法)

算法原理 蚁群算法来自于蚂蚁寻找食物过程中发现路径的行为。蚂蚁并没有视觉却可以寻找到食物&#xff0c;这得益于蚂蚁分泌的信息素&#xff0c;蚂蚁之间相互独立&#xff0c;彼此之间通过信息素进行交流&#xff0c; 从而实现群体行为。 蚁群算法的基本原理就是蚂蚁觅食的过程…...

【Pytorch实用教程】在做模型融合时非常关键的代码:nn.Identity()详解

文章目录 nn.Identity()基础介绍主要用途示例代码以ResNet为例介绍 self.resnet.fc = nn.Identity() 的作用1. **背景:ResNet 模型结构**2. **代码 `self.resnet.fc = nn.Identity()` 的作用**3. **为什么使用 `nn.Identity()`**4. **示例代码**nn.Identity()基础介绍 nn.Ide…...

【开源力荐】一款基于web的可视化视频剪辑工具

嗨, 大家好, 我是徐小夕. 之前一直在社区分享零代码&低代码的技术实践&#xff0c;也陆陆续续设计并开发了多款可视化搭建产品&#xff0c;比如&#xff1a; H5-Dooring&#xff08;页面可视化搭建平台&#xff09;V6.Dooring&#xff08;可视化大屏搭建平台&#xff09;橙…...

鸿萌数据恢复服务: 如何修复 SQL Server 数据库错误 829?

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据恢复、数据备份、网络及终端数据安全等解决方案与服务。 同时&#xff0c;鸿萌是众多国际主流数据恢复软件(Stellar、UFS、R-Studio、ReclaiMe Pro 等)的授权代理商&#xff0c…...

OpenCV图像处理——按最小外接矩形剪切图像

引言 在图像处理过程中&#xff0c;提取感兴趣区域&#xff08;ROI&#xff09;并在其上进行处理后&#xff0c;往往需要将处理后的结果映射回原图像。这一步通常涉及以下几个步骤&#xff1a; 找到最小外接矩形&#xff1a;使用 cv::boundingRect 或 cv::minAreaRect 提取感兴…...

《熬夜整理》保姆级系列教程-玩转Wireshark抓包神器教程(4)-再识Wireshark

1.简介 按照以前的讲解和分享路数&#xff0c;宏哥今天就应该从外观上来讲解WireShark的界面功能了。 2.软件界面 由上到下依次是标题栏、主菜单栏、主菜单工具栏、显示过滤文本框、打开区、最近捕获并保存的文件、捕获区、捕获过滤文本框、本机所有网络接口、学习区及用户指…...

调用yolov3模型进行目标检测

要调用已经训练好的YOLOv3模型对图片进行检测&#xff0c;需要完成以下几个步骤&#xff1a; 加载预训练模型&#xff1a;从预训练的权重文件中加载模型。准备输入图片&#xff1a;将图片转换为模型所需的格式。进行推理&#xff1a;使用模型对图片进行推理&#xff0c;得到检…...

linux文件——重定向原理——dup、重定向与execl、VFS

前言&#xff1a;本篇讲解linux下的重定向相关内容。 在本篇中&#xff0c; 博主将会带着友友们一边实验&#xff0c; 一边探索底层原理。 通过本篇的学习&#xff0c; 友友们将会了解到重定向是如何实现的&#xff0c; 重定向的本质是什么&#xff0c; 重定向和进程替换之间的…...

【STM32 FreeRTOS】任务

使用 RTOS 的实时应用程序可以被构建为一组独立的任务。每个任务在自己的上下文中执行&#xff0c;不依赖于系统内的其他任务或 RTOS 调度器本身。在任何时间点&#xff0c;应用程序中只能执行一个任务&#xff0c;实时 RTOS 调度器负责决定所要执行的任务。因此&#xff0c; R…...

Java面试--框架--Spring MVC

Spring MVC 目录 Spring MVC1.spring mvc简介2.spring mvc实现原理2.1核心组件2.2工作流程 3.RESTful 风格4.Cookie&#xff0c;Session4.1 会话4.2 保存会话的两种技术 5.拦截器5.1过滤器、监听器、拦截器的对比5.2 过滤器的实现5.3 拦截器基本概念5.4 拦截器的实现 1.spring …...

土壤水分监测系统的工作原理

TH-TS200土壤水分监测系统是一种在地球科学、农学等领域广泛应用的分析仪器&#xff0c;它主要用于监测土壤中的水分含量&#xff0c;为农业生产、水资源管理、环境保护等提供重要数据支持。通常包括数据采集器、土壤水分传感器、土壤温度传感器(部分系统配备)、计算机软件以及…...

k8s学习--如何控制pod调度的位置

文章目录 一、Pod 调度基础二、通过节点选择器 (Node Selector) 控制调度三、使用节点亲和性 (Node Affinity)四、使用污点和容忍 (Taints and Tolerations)五、Pod 反亲和性 (Pod Anti-Affinity) 总结 在 Kubernetes (K8s)中&#xff0c;Pod 是应用运行的最小单位&#xff0…...

基于mysqldump的MySQL数据库异地备份方案(含完整脚本和解释)

MySQL数据库异地备份方案 0 文档描述 本文描述了一个数据库异地备份方案&#xff0c;以下脚本代码都是在线上应用的本文以CentOS7为例&#xff0c;其他系统请自行查询安装命令如果评论有需求&#xff0c;我就对应系统做一下文档 1 基本原理 1.1 流程 原理本身很简单&#…...

C语言中10个字符串函数详解

目录 1.strlen 2.strcpy 3.strcat 4.strcmp 5.strncpy 6.strncat 7.strncmp 8.strstr 9.strtok 10.strerror 1.strlen 基本结构&#xff1a;size_t strlen(const char *str)&#xff1b;功能&#xff1a;用于计算字符串的长度&#xff1b;字符串已经 0作为结束标志…...

flume系列之:查询多个flume agent组是否有topic重复接入情况

flume系列之:查询多个flume agent组是否有topic重复接入情况 一、查询zk节点下的flume agent组二、获取采集的topic三、获取重复接入的topic,支持设置重复接入白名单四、执行流程五、完整代码一、查询zk节点下的flume agent组 def get_flumeAgent_zkPath(zkRootPaths):for z…...

Windows自动化1️⃣环境搭建WinAppDriver

对于技术选型: 我尝试了, pywinauto, WinAppDriver,CukeTest 担心CukeTest可能会收费, 尝试pywinauto,在元素点击,搜索时, 遇到不可用情况; WinAppDriver是微软家的,大厂开源, 就它了! 步骤一&#xff1a;安装WinAppDriver 进入WinAppDriver下载页面&#xff08;https://githu…...

云服务器Docker内部署服务后,端口无法访问?

云服务器Docker内部署服务后&#xff0c;端口无法访问&#xff0c;可以按照以下思路进行排查&#xff1a; 以【docker run --name my-nginx -d -p 9395:80 nginx】举例&#xff1a; 查看Docker映射是否正确&#xff0c;可使用docker ps命令查看。Docker是否设置端口映射&#…...

Unity将摄像机视角保存成Json文件方便读取使用

系列文章目录 unity工具 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、设置环境&#x1f449;二、代码如下&#x1f449;三、使用方法 &#x1f449;四、下次外部调用json里面的摄像机位置的时候如下代码方法&#x1f449;壁纸分享&#x1f449;总结 &#x1f449…...

git是什么/基本指令

git作用 去中心化&#xff0c; 分布式版本控制器 新增术语&#xff1a;仓库区&#xff0c; 工作区&#xff0c; 暂存区 具体见下板书 常用git命令 git clone 仓库网址 git status 查看仓库状态 git add newfile 临时添加到git仓库 git commit -m 正式添加git仓库 g…...

Linux 中的同步机制

代码基于&#xff1a;Kernel 6.6 临界资源&#xff1a;指哪些在同一时刻只允许被一个线程访问的软件或硬件资源。这种资源的特点是&#xff0c;如果有线程正在使用&#xff0c;其他进程必须等待直到该线程释放资源。 临界区&#xff1a;指在每个线程中访问临界资源的那段代码。…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...