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

启发式算法-蚁群算法

蚁群算法是模拟蚂蚁觅食行为的仿生优化算法,原理是信息素的正反馈机制,蚂蚁通过释放信息素来引导同伴找到最短路径。把问题的元素抽象为多条路径,每次迭代时为每只蚂蚁构建一个解决方案,该解决方案对应一条完整的路径,每次迭代后对所有路径上的信息素按一定比例模拟自然蒸发,避免局部最优,然后找出当前的最优路径进行信息素增强,在之后的迭代中蚂蚁就会倾向于选择信息素浓度高的路径,经过多次迭代后,找出全局的最优路径。该算法通常用于解决旅行商等NP难问题,算法性能依赖参数(如信息素重要因子 α、启发式因子 β、挥发率 ρ 等),结果难以预测,有一定的玄学。

算法流程
在这里插入图片描述

集合覆盖问题

给定一个全集U和若干子集S1, S2, …, Sn,找到最少数量的子集,使得它们的并集等于U。例如:

全集 U = {1, 2, 3, 4, 5}
子集 S1 = {1, 3}, S2 = {2, 3}, S3 = {3, 4}, S4 = {1, 4, 5}
最优解:[S1, S3] 能覆盖所有元素的最小子集数量为2。

蚁群算法代码

import java.util.*;public class AcoSetCover {// 定义全集和子集static Set<Integer> universe = new HashSet<>(Arrays.asList(1, 2, 3, 4,5));static List<Set<Integer>> subsets = Arrays.asList(new HashSet<>(Arrays.asList(1, 3)),new HashSet<>(Arrays.asList(2, 3)),new HashSet<>(Arrays.asList(3, 4)),new HashSet<>(Arrays.asList(1, 4, 5)));static int numSubsets = subsets.size();// 算法参数static int m = 10;      // 蚂蚁数量static int maxIter = 10000;     // 最大迭代次数static double alpha = 1.0;    // 信息素重要因子static double beta = 2.0;     // 启发式因子static double rho = 0.1;      // 信息素挥发率static double Q = 1.0;        // 信息素强度static double[] pheromone;    // 子集的信息素public static void main(String[] args) {initializePheromone();List<Integer> bestSolution = null;int bestSize = Integer.MAX_VALUE;for (int iter = 0; iter < maxIter; iter++) {List<List<Integer>> antSolutions = new ArrayList<>();for (int ant = 0; ant < m; ant++) {List<Integer> solution = constructSolution();antSolutions.add(solution);if (solution.size() < bestSize) {bestSize = solution.size();bestSolution = new ArrayList<>(solution);}}updatePheromone(antSolutions);}System.out.println("全集: "+universe);System.out.println("子集: "+subsets);System.out.println("最优解子集下标: " + bestSolution);for(int i:bestSolution){System.out.println(subsets.get(i));}}// 初始化信息素static void initializePheromone() {pheromone = new double[numSubsets];Arrays.fill(pheromone, 1.0); // 初始信息素为1}// 蚂蚁构建解static List<Integer> constructSolution() {Set<Integer> covered = new HashSet<>();List<Integer> solution = new ArrayList<>();List<Integer> candidates = new ArrayList<>();while (!covered.equals(universe)) {candidates.clear();for (int i = 0; i < numSubsets; i++) {if (!solution.contains(i) && !Collections.disjoint(subsets.get(i), universe)) {Set<Integer> subset = subsets.get(i);if (!covered.containsAll(subset)) {candidates.add(i);}}}if (candidates.isEmpty()) break;// 计算选择概率double[] probabilities = new double[candidates.size()];double total = 0.0;for (int i = 0; i < candidates.size(); i++) {int subsetIdx = candidates.get(i);double heuristic = (double) (subsets.get(subsetIdx).size() - covered.size()) / subsets.get(subsetIdx).size();probabilities[i] = Math.pow(pheromone[subsetIdx], alpha) * Math.pow(heuristic, beta);total += probabilities[i];}// 轮盘赌选择double rand = Math.random() * total;double cumulative = 0.0;int selected = -1;for (int i = 0; i < candidates.size(); i++) {cumulative += probabilities[i];if (cumulative >= rand) {selected = candidates.get(i);break;}}// 更新覆盖集和解solution.add(selected);covered.addAll(subsets.get(selected));}return solution;}// 更新信息素static void updatePheromone(List<List<Integer>> antSolutions) {// 信息素挥发for (int i = 0; i < numSubsets; i++) {pheromone[i] *= (1 - rho);}// 蚂蚁释放信息素for (List<Integer> solution : antSolutions) {double delta = Q / solution.size();for (int subsetIdx : solution) {pheromone[subsetIdx] += delta;}}}
}

在这里插入图片描述

该算法还可以用于解决覆盖设计问题
在这里插入图片描述

相关文章:

启发式算法-蚁群算法

蚁群算法是模拟蚂蚁觅食行为的仿生优化算法&#xff0c;原理是信息素的正反馈机制&#xff0c;蚂蚁通过释放信息素来引导同伴找到最短路径。把问题的元素抽象为多条路径&#xff0c;每次迭代时为每只蚂蚁构建一个解决方案&#xff0c;该解决方案对应一条完整的路径&#xff0c;…...

DeepSeek与MySQL:开启数据智能新时代

目录 一、引言&#xff1a;技术融合的力量二、DeepSeek 与 MySQL&#xff1a;技术基石2.1 DeepSeek 技术探秘2.2 MySQL 数据库深度解析 三、DeepSeek 与 MySQL 集成&#xff1a;从理论到实践3.1 集成原理剖析3.2 集成步骤详解 四、应用案例&#xff1a;实战中的价值体现4.1 电商…...

Modbus 通讯协议(超详细,简单易懂)

目录 一、协议中的寄存器定义 二、协议概述 三、使用串口的Modbus 报文帧 ​编辑 3.1、Modbus ASCII 模式 3.2、Modbus RTU 模式 3.3、功能码概要 3.4、Modbus 报文分析 四、什么是RS-485 RS-232&#xff1f; 一、协议中的寄存器定义 阅读 Modbus 协议时会发现它的概念别扭…...

单细胞测序试验设计赏析(一)

单细胞测序试验设计赏析&#xff08;一&#xff09; 单细胞测序试验设计中&#xff0c;单细胞测序技术通常会结合其它的技术来共同说明问题&#xff0c;或者结合年龄、性别等临床数据&#xff0c;进行分层分析说明问题以下以发表文章来进行一定的分析。 Single-cell RNA seque…...

ES6入门---第二单元 模块三:对象新增、

一&#xff1a;对象简洁语法&#xff1a; 1、变量简洁 <script>let name Strive;let age 18;let json {name, //name:name,age //age:age};console.log(json);</script> 2、函数简洁 let json {name, //name:name,age, //age:age/* showA:functi…...

多元随机变量协方差矩阵

主要记录多元随机变量数字特征相关内容。 关键词&#xff1a;多元统计分析 二元随机变量(X, Y) 说明&#xff1a;可以理解变量中的 X为身高、Y为体重 总体协方差 σ X Y c o v ( X , Y ) E [ ( X − μ X ) ( Y − μ Y ) ] E ( X Y ) − μ X μ Y \sigma_{XY}cov(X, Y)E[…...

计算机网络-同等学力计算机综合真题及答案

计算机网络-同等学力计算机综合真题及答案 &#xff08;2003-2024&#xff09; 2003 年网络 第二部分 计算机网络&#xff08;共 30 分&#xff09; &#xff08;因大纲变动因此 2004 年真题仅附真题&#xff0c;不作解析。&#xff09; 一、填空题&#xff08;共 10 分&#…...

[案例二] 菜单条制作(Menuscript)与工具条制作(Toolbar)

最近五一正好毕业论文盲审,抽时间研究一下菜单条制作(Menuscript)与工具条制作(Toolbar)的制作,在NX二次开发中唐康林老师已经讲的很详细了,在这里只对视频中的内容进行总结,并且根据自己的想法进行补充。在里海博主的直播教学中发现一个很有趣的NX图标工具,本人大概做了一…...

bellard.org‌ : QuickJS 如何使用 qjs 执行 js 脚本

参阅上一篇&#xff1a;Fabrice Bellard&#xff08;个人网站&#xff1a;‌bellard.org‌&#xff09;介绍 Fabrice Bellard&#xff08;个人网站&#xff1a;‌bellard.org‌&#xff09;是计算机领域最具影响力的程序员之一&#xff0c;其贡献跨越多个技术领域并持续推动开…...

计组复习笔记 3

前言 继续做例题。昨天做到第一个就把我难住了。可恶。 4.1 地址码越长&#xff0c;操作码越短。因为两者加起来是指令字&#xff0c;指令字的大小一般是固定的。扩展编码按照操作码从短到长进行编码。算了先放一下。我先看一下别的复习资料。等会儿再看这个题。 鼓励自己 …...

GCD 深入解析:从使用到底层实现

前言 Grand Central Dispatch (GCD) 是 Apple 基于 C 语言开发的一套完整的并发编程框架。它不仅仅是一个简单的线程管理工具&#xff0c;而是一个高度优化的并发编程解决方案。GCD 的设计理念是将并发编程的复杂性封装在框架内部&#xff0c;为开发者提供简单易用的接口。本文…...

JavaScript中的AES加密与解密:原理、代码与实战

前言 关于有js加密、js解密&#xff0c;js业务相关&#xff0c;找jsjiami官网站长v。 另外前段时间做了个单子跑单了&#xff0c;出售TEMU助手。eller点kuajingmaihuo点com的全自动化助手&#xff0c;可以批量合规&#xff0c;批量实拍图&#xff0c;批量资质上传等。 一、A…...

计算机组成原理实验(7) 堆指令部件模块实验

实验七 堆指令部件模块实验 一、实验目的 1、掌握指令部件的组成方式。 2、熟悉指令寄存器的打入操作&#xff0c;PC计数器的设置和加1操作&#xff0c;理解跳转指令的实现过程。 二、实验要求 按照实验步骤完成实验项目&#xff0c;掌握数据打入指令寄存器IR1、PC计数器的…...

Windows系统下Node.js环境部署指南:使用nvm管理多版本

Windows系统下Node.js环境部署指南&#xff1a;使用nvm管理多版本 一、Node.js介绍二、为什么需要nvm&#xff1f;三、安装前的准备工作1. 本次环境说明2. 卸载现有Node.js&#xff08;如有&#xff09; 三、nvm-windows安装步骤1. 下载安装包2. 安装过程3. 验证安装 四、使用n…...

数据结构*队列

队列 什么是队列 是一种线性的数据结构&#xff0c;和栈不同&#xff0c;队列遵循“先进先出”的原则。如下图所示&#xff1a; 在集合框架中我们可以看到LinkedList类继承了Queue类&#xff08;队列&#xff09;。 普通队列&#xff08;Queue&#xff09; Queue中的方法 …...

C语言蓝桥杯真题代码

以下是不同届蓝桥杯C语言真题代码示例&#xff0c;供参考&#xff1a; 第十三届蓝桥杯省赛 C语言大学B组 真题&#xff1a;卡片 题目&#xff1a;小蓝有很多数字卡片&#xff0c;每张卡片上都是数字1-9。他想拼出1到n的数列&#xff0c;每张卡片只能用一次&#xff0c;求最大的…...

Sharding-JDBC分库分表中的热点数据分布不均匀问题及解决方案

引言 在现代分布式应用中&#xff0c;使用Sharding-JDBC进行数据库的分库分表是提高系统性能和扩展性的常见策略。然而&#xff0c;在实际应用中&#xff0c;某些特定的数据&#xff08;如最新订单、热门商品等&#xff09;可能会成为“热点”&#xff0c;导致这些部分的数据处…...

Dagster中的Ops与Assets:数据管道构建的两种选择

Dagster是一个强大的数据编排平台&#xff0c;它提供了多种工具来帮助数据工程师构建可靠的数据管道。在Dagster中&#xff0c;Ops和Assets是两种核心概念&#xff0c;用于定义数据处理逻辑。本文将全面介绍Ops的概念、特性及其使用方法&#xff0c;特别补充了Op上下文和Op工厂…...

thonny提示自动补全功能

THONNY IDE 自动补全功能配置 在 Thonny IDE 中启用和优化自动补全功能可以显著提升编程体验。为了确保该功能正常工作&#xff0c;需要确认几个设置选项。 配置自动补全 Thonyy IDE 的自动补全默认情况下是开启的。如果发现自动补全未按预期运行&#xff0c;可以通过调整首选…...

PyTorch_阿达玛积

阿达玛积指的是矩阵对应位置的元素相乘&#xff0c;可以使用乘号运算符&#xff0c;也可以使用mul函数来完成计算。 代码 import torch import numpy as np # 1. 使用 mul 函数 def test01():data1 torch.tensor([[1, 2], [3, 4]])data2 torch.tensor([[5, 6], [7, 8]])dat…...

蓝桥杯 摆动序列

摆动序列 原题目链接 题目描述 如果一个序列的奇数项都比前一项大&#xff0c;偶数项都比前一项小&#xff0c;则称为一个摆动序列。 即对于任意整数 i&#xff08;i ≥ 1&#xff09;满足&#xff1a; a₂ᵢ < a₂ᵢ₋₁&#xff0c;a₂ᵢ₊₁ > a₂ᵢ 小明想知道&…...

AI 与生物技术的融合:开启精准医疗的新纪元

在科技飞速发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;与生物技术的融合正在成为推动医疗领域变革的重要力量。精准医疗作为现代医学的重要发展方向&#xff0c;旨在通过深入了解个体的基因信息、生理特征和生活方式&#xff0c;为患者提供个性化的治疗方案。AI…...

三、shell脚本--运算符与表达式:让脚本学会“思考”

一、算术运算符&#xff1a;加减乘除取模 在我们写shell脚本时&#xff0c;做点基本的数学运算还是经常需要的。常用的算术运算符跟我们平时学的一样&#xff1a; : 加- : 减* : 乘 (小提示&#xff1a;有时候在某些命令里可能需要写成 \*)/ : 除 (在 Shell 里通常是取整数部分…...

c++ 指针参数传递的深层原理

指针参数传递的深层原理 理解为什么可以修改指针指向的内容但不能直接修改指针本身&#xff0c;需要深入理解指针在内存中的表示方式和函数参数传递机制。 1. 指针的内存表示 指针本质上是一个变量&#xff0c;它存储的是另一个变量的内存地址。在内存中&#xff1a; 假设有…...

【查看.ipynp 文件】

目录 如何打开 .ipynb 文件&#xff1f; 如果确实是 .ipynp 文件&#xff1a; .ipynp 并不是常见的 Jupyter Notebook 文件格式。通常&#xff0c;Jupyter Notebook 文件的扩展名是 .ipynb&#xff08;即 Interactive Python Notebook&#xff09;。如果你遇到的是 .ipynb 文…...

C++ 简单工厂模式详解

简单工厂模式&#xff08;Simple Factory Pattern&#xff09;是最简单的工厂模式&#xff0c;它不属于GoF 23种设计模式&#xff0c;但它是工厂方法模式和抽象工厂模式的基础。 概念解析 简单工厂模式的核心思想是&#xff1a; 将对象的创建逻辑集中在一个工厂类中 客户端不…...

ubuntu使用apt安装软件

1、使用apt list |grep jdk查看要安装的软件 此处以jdk为例 2、执行名称&#xff1a;安装指定版本的软件 sudo apt install openjdk-11-jdk...

TFT(薄膜晶体管)和LCD(液晶显示器)区别

TFT&#xff08;薄膜晶体管&#xff09;和LCD&#xff08;液晶显示器&#xff09;是显示技术中常见的术语&#xff0c;二者既有联系又有区别。以下是它们的核心区别和关系&#xff1a; 1. 基本概念 LCD&#xff08;液晶显示器&#xff09; LCD是一种利用液晶材料特性控制光线通…...

【文献阅读】中国湿地随着保护和修复的反弹

一、研究背景 滨海湿地是全球最具生态价值的生态系统之一&#xff0c;广泛分布在河口、潮间带、泻湖和盐沼等地带&#xff0c;在调节气候、水质净化、生物栖息以及防止海岸侵蚀等方面发挥着关键作用。然而&#xff0c;近年来滨海湿地正面临严峻威胁&#xff0c;全球估计约有50%…...

用Ensaio下载GIS数据

文章目录 简介重力场绘制 简介 Ensaio在葡萄牙语中是随笔的意思&#xff0c;是一个用于下载开源数据集的python库。其底层基于Pooch来下载和管理数据。 Ensaio可通过pip或者conda来安装 pip isntall ensaio conda install ensaio --channel conda-forge由于这个库功能较为单…...

【算法基础】递归算法 - JAVA

一、递归基础 1.1 什么是递归算法 递归算法是一种通过函数调用自身来解决问题的方法。简单来说&#xff0c;就是"自己调用自己"。递归将复杂问题分解为同类的更简单子问题&#xff0c;直到达到易于直接解决的基本情况。 1.2 递归的核心要素 递归算法由两个关键部…...

连续变量与离散变量的互信息法

1. 互信息法简介 互信息&#xff08;Mutual Information, MI&#xff09; 是一种衡量两个变量之间相互依赖程度的统计量&#xff0c;它来源于信息论。互信息可以用于评估特征与目标变量之间的相关性&#xff0c;无论这些变量是连续的还是离散的。互信息法是一种强大的特征选择…...

java_Lambda表达式

1、背景 lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。lambda表达式就和方法一样样&#xff0c;它提供了一个正常的参数列表和一个使用这些参数的主体&#xff08;body&#xff0c;可以是一个表达式和一个代码块&#xff09;。La…...

Python Cookbook-6.17 NuIl对象设计模式的实现

任务 你想减少代码中的条件声明&#xff0c;尤其是针对特殊情况的检查。 解决方案 一种常见的代表“这里什么也没有”的占位符是 None&#xff0c;但我们还可以定义一个类&#xff0c;其行为方式和这种占位符相似&#xff0c;而且效果更好: class Null(object):Null对象总是…...

Java接口全面教程:从入门到精通

目录 接口的基本概念 接口的特性 1. 访问修饰符 2. 接口中的常量 3. 接口中的方法 3.1 抽象方法&#xff08;传统用法&#xff09; 3.2 默认方法&#xff08;Java 8 引入&#xff09; 3.3 静态方法&#xff08;Java 8 引入&#xff09; 3.4 私有方法&#xff08;Java …...

Power Query精通指南3:数据库(查询折叠与数据隐私)、批量合并文件、自定义函数

文章目录 九、批量合并文件9.1 案例背景9.2 合并文件的标准流程9.3 示例&#xff1a;合并文件9.3.1 连接到文件夹9.3.1.1 连接到本地 / 网络文件夹9.3.1.2 连接到 SharePoint 文件夹9.3.1.3 连接到 OneDrive for Business9.3.1.4 连接到其他文件系统 9.3.2 筛选文件9.3.3 合并文…...

Python 学习

这里主要是为了记录我学习Python的过程&#xff0c;更多是使我规范书写Pyhton语言&#xff01; 1. 第一章 Python 定义&#xff1a;一种解释型的语言&#xff0c;区别于其他的高级语言&#xff0c;逐行翻译进行执行。 过程&#xff1a;首先编写编程语言&#xff0c;利用Pytho…...

生成式 AI 的优势

在科技飞速发展的今天,人工智能已经不再是一个遥不可及的概念,而是逐渐渗透到我们生活的方方面面。其中,生成式 AI 更是如同一颗璀璨的新星,在人工智能的浩瀚星空中闪耀着独特的光芒。它究竟有哪些令人瞩目的优势,又为何会成为我们这个时代无法忽视的存在呢? 生成式 AI …...

Hal库下备份寄存器

首先要确保有外部电源给VBAT供电 生成后应该会有这两个文件&#xff08;不知道为什么生成了好几次都没有&#xff0c;复制工程在试一次就有了&#xff09; 可以看到stm32f407有20个备份寄存器 读写函数 void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t Backup…...

P1537 数字反转(升级版)详解

这个题目还是对于新手比较锻炼思维严谨性的&#xff0c;我认为是在我做过的一些题目中&#xff0c;此题算上等马 先看题目 我先说明我自己的思路&#xff0c;以及这个题目你需要特别注意的地方 1&#xff0c;数字反转&#xff0c;①可用<algorithm>库里面的reverse函数…...

operator 可以根据需要重载 == 运算符进行比较

要将 vector<AppInfo> 类型的 A 和 B 两个容器进行比较&#xff0c;并且当 B 中有 A 中没有的元素时&#xff0c;插入到数据库中&#xff0c;你可以通过以下步骤实现&#xff1a; 比较元素&#xff1a;遍历 vector<B>&#xff0c;检查每个元素是否在 vector<A&…...

网格不迷路:用 CSS 网格生成器打造完美布局

前言 你是否曾因写错 grid-template-areas 而捶键盘?是否在面对千层嵌套的复杂布局时,瞬间怀疑人生,甚至思考要不要转行去卖奶茶?别慌,CSS 网格生成器闪亮登场,像拼乐高一样,帮你轻松搭建网页结构,还能自动输出干净代码,堪称“前端界的乐高大师”。让我们放下枯燥的代…...

Go小技巧易错点100例(二十八)

本期分享&#xff1a; 1. runtime.Caller(1)获取调用者信息 2. for循环 select{}语法 正文&#xff1a; runtime.Caller(1)获取调用者信息 在 Go 语言中&#xff0c;runtime.Caller(1) 是 runtime 包提供的一个函数&#xff0c;用于获取当前 goroutine 的调用堆栈中的特定…...

Java变量简介

Java变量 -为什么需要变量? 一个程序就是一个世界 变量是程序的基本组成单位 不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位,比如: //变量有三个基本要素(类型+名称+值) class Test{public static void main(String [largs){int a=1;int b=3:b=89;Syst…...

Java快速上手之实验六

1. 编写ItemEventDemo.java&#xff0c;当选中或取消选中单选钮、复选钮和列表框时显示所选的结果。 2&#xff0e;编写GUIExample.java&#xff0c;当选中或取消选中单选钮、复选钮时在标签中显示相应结果。 import javax.swing.*; import java.awt.*; import java.awt.event.…...

【算法应用】基于灰狼算法优化深度信念网络回归预测(GWO-DBN)

目录 1.深度信念网络&#xff08;Deep Belief Networks, DBNs&#xff09;2.灰狼算法GWO原理3.结果展示4.参考文献5.代码获取6.读者交流 1.深度信念网络&#xff08;Deep Belief Networks, DBNs&#xff09; 深度信念网络&#xff08;Deep Belief Networks, DBNs&#xff09;是…...

基于Spring Boot实现STDIO通信的MCP Server与验证

STDIO 是一种基于标准输入输出(Standard Input/Output)的本地通信机制,旨在实现客户端与服务端之间的高效交互。 STDIO 是 MCP 协议支持的传输方式之一,通过操作系统的管道机制(stdin/stdout)进行数据传输,适用于客户端与服务端在同一台机器上的本地通信场景。 本篇基于…...

springboot基于推荐算法的景点推荐系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 本景点推荐系统采用B/S架构&#xff0c;数据库是MySQL&#xff0c;网站的搭建与开发采用了先进的Java进行编写&#xff0c;使用了协同过滤推荐算法和Spring Boot框架。该系统从两个对象&#xff1a;由管理员和用户来对系统进行设计构建。前台主要功能包括&#xff1a;用户…...

【LeetCode Hot100】栈篇

前言 本文用于整理LeetCode Hot100中题目解答&#xff0c;因题目比较简单且更多是为了面试快速写出正确思路&#xff0c;只做简单题意解读和一句话题解方便记忆。但代码会全部给出&#xff0c;方便大家整理代码思路。 20. 有效的括号 一句话题意 验证括号序列有效性。 一句话…...

IO模型和多路复用

一、IO模型的基础理解 什么是IO? IO全称是 Input/Output(输入/输出),在计算机科学里主要指程序与外部设备(硬盘、网络、用户终端等)进行数据交换的操作。首要特点是: IO通常很慢(从CPU和内存的视角看)经常需要等待外部设备响应1. 为什么要谈IO模型? 当一个程序需要…...