启发式算法-蚁群算法

蚁群算法是模拟蚂蚁觅食行为的仿生优化算法,原理是信息素的正反馈机制,蚂蚁通过释放信息素来引导同伴找到最短路径。把问题的元素抽象为多条路径,每次迭代时为每只蚂蚁构建一个解决方案,该解决方案对应一条完整的路径,每次迭代后对所有路径上的信息素按一定比例模拟自然蒸发,避免局部最优,然后找出当前的最优路径进行信息素增强,在之后的迭代中蚂蚁就会倾向于选择信息素浓度高的路径,经过多次迭代后,找出全局的最优路径。该算法通常用于解决旅行商等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;}}}
}

在这里插入图片描述

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

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

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

相关文章

Redis 脚本:深入理解与实践指南

Redis 脚本:深入理解与实践指南 引言 Redis 是一款高性能的键值存储数据库,广泛应用于缓存、消息队列、分布式锁等领域。脚本在 Redis 中扮演着至关重要的角色,它允许开发者以编程的方式执行复杂的操作,提高数据处理的效率。本文将深入探讨 Redis 脚本的概念、应用场景、…

Vue3 Echarts 3D立方体柱状图实现教程

文章目录 前言一、实现原理二、series ——type: "pictorialBar" 简介2.1 常用属性 三、代码实战3.1 封装一个echarts通用组件 echarts.vue3.2 实现一个立方体柱状图&#xff08;1&#xff09;首先实现一个基础柱状图&#xff08;2&#xff09;添加立方体棱线&#x…

每天一道面试题@第五天

1.包装类型的缓存机制了解么&#xff1f; 指部分包装类在创建对象时&#xff0c;会将一定范围内的对象缓存起来&#xff0c;当再次使用相同值创建对象时&#xff0c;优先从缓存中获取&#xff0c;而不是重新创建新对象。【提高性能】【节省内存】 列举几个常见的包装类缓存机…

mysql--索引

索引作为一种数据结构&#xff0c;其用途是用于提升检索数据的效率。 分类 普通索引&#xff08;INDEX&#xff09;&#xff1a;索引列值可重复 唯一索引&#xff08;UNIQUE&#xff09;&#xff1a;索引列值必须唯一&#xff0c;可以为NULL 主键索引&#xff08;PRIMARY KEY&a…

王道考研数据结构课后题代码题(2026版)——排序部分

一、前言 本合集以王道考研《数据结构》辅导书&#xff08;2026版&#xff09;课后习题代码题部分为参考依据&#xff0c;给出课后习题代码题的可执行代码的实现&#xff0c;本合集使用编程语言以C/C语言为主&#xff0c;也不限于使用Python和Java语言&#xff0c;本套合计代码…

AVFormatContext 再分析零

随着对于AVFormatContext 各个参数的学习&#xff0c;逐渐可以从 整体架构上 再认识一下 AVFormatContext 了。 还是从解封装的第一步开始。 int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options); 实际上…

uniapp打包apk详细教程

目录 1.打apk包前提条件 2.获取uni-app标识 3.进入dcloud开发者后台 4.开始打包 1.打apk包前提条件 1.在HBuilderX.exe软化中&#xff0c;登录自己的账号 2.在dcloud官网&#xff0c;同样登录自己的账号。没有可以免费注册。 2.获取uni-app标识 获取方法&#xff1a;点…

Vue2 和 Vue3 的核心区别

1. 响应式原理&#xff1a;从「手动挡」到「自动挡」 Vue2&#xff1a; 使用 Object.defineProperty 监听数据变化&#xff0c;但无法检测新增属性和数组索引修改&#xff0c;需要借助 Vue.set。 // Vue2 中修改数组元素不会触发视图更新 this.list[0] 新值; // ❌ 不…

EMMC存储性能测试方法

记于 2022 年 9 月 15 日 EMMC存储性能测试方法 - Wesley’s Blog 参考Android-emmc性能测试 | 一叶知秋进行实践操作 dd 命令 页面缓存 为了测试 emmc 的真实读写性能&#xff0c;我们需要先把页面缓存给清理&#xff1a; echo 1 > /proc/sys/vm/drop_caches console:…

软件管理(安装方式)

1.rpm安装 1.1.rpm介绍 rpm软件包名称: 软件名称 版本号(主版本、次版本、修订号) 操作系统 -----90%的规律 举例:openssh-6.6.1p1-31.el7.x86_64.rpm 数字是版本号:第一位主版本号,第二位次版本号,带横杠的是修订号, el几---操作系统的版本。 #用rpm安装需要考虑如下信…

OnlyOffice Document Server 源码调试指南-ARM和x86双模式安装支持

在ARM64架构下创建的ONLYOFFICE源码调试容器具有显著优势。该容器基于官方Document Server镜像构建&#xff0c;通过集成Git、Python和Node.js等工具链&#xff0c;实现跨平台环境一致性&#xff0c;确保ARM设备的兼容性。容器化隔离消除了依赖冲突&#xff0c;支持快速部署到边…

oracle 数据库查询指定用户下每个表占用空间的大小,倒序显示

oracle 查询指定用户下每个表占用空间的大小&#xff0c;倒序显示 使用场景&#xff1a;数据分析&#xff1b;导出医院正式库到开发环境时&#xff0c;查询出占用表空间高的业务表、导出时排除该表 在Oracle数据库中&#xff0c;要查询指定用户下每个表占用空间的大小并以倒序…

归并排序【逆序对】

目录 归并排序原理 逆序对 归并排序 主要利用分治思想&#xff0c;时间复杂度O(nlogn) 原理 1.对数列不断等长拆分&#xff0c;直到一个数的长度。2.回溯时&#xff0c;按升序合并左右两段。3.重复以上两个过程&#xff0c;直到递归结束。 合并 1.i&#xff0c;j分别指向a的…

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

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

对比表格:数字签名方案、密钥交换协议、密码学协议、后量子密码学——密码学基础

文章目录 一、数字签名方案1.1 ECDSA&#xff1a;基于椭圆曲线的数字签名算法1.2 EdDSA&#xff1a;Edwards曲线数字签名算法1.3 RSA-PSS&#xff1a;带有概率签名方案的RSA1.4 数字签名方案对比 二、密钥交换协议2.1 Diffie-Hellman密钥交换2.2 ECDH&#xff1a;椭圆曲线Diffi…

Linux 进程间通信(IPC)详解

进程间通信&#xff08;IPC&#xff09;深入解析 一、进程间通信概述 在操作系统里&#xff0c;不同进程间常常需要进行数据交换、同步协调等操作&#xff0c;进程间通信&#xff08;Inter - Process Communication&#xff0c;IPC&#xff09;机制应运而生。在Linux系统中&a…

深度解析ComfyUI的使用

一、ComfyUI 概述 ComfyUI 本质上是一个专为 AI 绘画爱好者和专业人士打造的用户界面工具&#xff0c;它的核心作用是将复杂的 AI 绘画生成过程以直观的方式呈现给用户。与传统的图像生成工具不同&#xff0c;ComfyUI 借助其独特的节点化工作流系统&#xff0c;把深度学习模型…

模型测试报错:有2张显卡但cuda.device_count()显示GPU卡数量只有一张

此贴仅为记录debug过程&#xff0c;为防后续再次遇见 问题 问题情境 复现文章模型&#xff0c;使用GPU跑代码&#xff0c;有两张GPU&#xff0c;设置在 cuda: 1 上跑 问题描述 在模型测试加载最优模型时报错&#xff1a;torch.cuda.device_count()显示GPU卡数量只有一张&…

【计网】认识跨域,及其在go中通过注册CORS中间件解决跨域方案,go-zero、gin

一、跨域&#xff08;CORS&#xff09;是什么&#xff1f; 跨域&#xff0c;指的是浏览器出于安全限制&#xff0c;前端页面在访问不同源&#xff08;协议、域名、端口任一不同&#xff09;的后端接口时&#xff0c;会被浏览器拦截。 比如&#xff1a; 前端地址后端接口地址是…

内存性能测试方法

写于 2022 年 6 月 24 日 内存性能测试方法 - Wesley’s Blog dd方法测试 cat proc/meminfo console:/ # cat proc/meminfo MemTotal: 3858576 kB MemFree: 675328 kB MemAvailable: 1142452 kB Buffers: 65280 kB Cached: 992252 …