常用的启发式算法:探索问题解决的智慧之道
启发式算法是一种通过启发式信息来引导搜索的算法,常用于解决那些在合理时间内难以找到最优解的问题。本文将介绍几种常用的启发式算法,包括贪心算法、遗传算法和模拟退火算法,并提供Java代码实现及测试,帮助读者深入理解这些算法的原理和应用。
1. 贪心算法(Greedy Algorithm)
贪心算法是一种简单而有效的启发式算法,它通过每一步都选择当前状态下最优的解决方案来达到全局最优解。虽然贪心算法不能保证获得最优解,但在某些问题上表现出色,例如最小生成树、最短路径等。以下是贪心算法的Java实现及测试:
import java.util.*;public class GreedyAlgorithm {public static List<Integer> findMinimumSet(int[] nums, int target) {Arrays.sort(nums);List<Integer> result = new ArrayList<>();int sum = 0;for (int i = nums.length - 1; i >= 0; i--) {if (sum + nums[i] <= target) {sum += nums[i];result.add(nums[i]);}}return result;}public static void main(String[] args) {int[] nums = {1, 3, 2, 4, 6, 5};int target = 10;List<Integer> result = findMinimumSet(nums, target);System.out.println("Greedy Algorithm Result: " + result);}
}
2. 遗传算法(Genetic Algorithm)
遗传算法是一种模拟生物进化过程的启发式算法,通过模拟遗传、交叉和变异等操作来搜索解空间中的最优解。遗传算法适用于解决复杂的优化问题,例如旅行商问题、装箱问题等。以下是遗传算法的Java实现及测试:
import java.util.*;public class GeneticAlgorithm {private static final int POPULATION_SIZE = 10;private static final int CHROMOSOME_LENGTH = 8;private static final int MAX_GENERATIONS = 100;private static final double MUTATION_RATE = 0.1;private static Random random = new Random();// 随机生成染色体private static int[] generateChromosome() {int[] chromosome = new int[CHROMOSOME_LENGTH];for (int i = 0; i < CHROMOSOME_LENGTH; i++) {chromosome[i] = random.nextInt(2); // 0或1}return chromosome;}// 计算染色体的适应度(假设目标是所有基因都为1)private static int calculateFitness(int[] chromosome) {int fitness = 0;for (int gene : chromosome) {fitness += gene;}return fitness;}// 选择父代private static int[][] selectParents(int[][] population) {int[][] parents = new int[2][CHROMOSOME_LENGTH];// 根据适应度进行轮盘赌选择int totalFitness = Arrays.stream(population).mapToInt(chromosome -> calculateFitness(chromosome)).sum();int threshold = random.nextInt(totalFitness);int accumulatedFitness = 0;for (int[] chromosome : population) {accumulatedFitness += calculateFitness(chromosome);if (accumulatedFitness >= threshold) {parents[0] = chromosome;break;}}threshold = random.nextInt(totalFitness);accumulatedFitness = 0;for (int[] chromosome : population) {accumulatedFitness += calculateFitness(chromosome);if (accumulatedFitness >= threshold) {parents[1] = chromosome;break;}}return parents;}// 交叉操作private static int[][] crossover(int[] parent1, int[] parent2) {int crossoverPoint = random.nextInt(CHROMOSOME_LENGTH);int[] child1 = new int[CHROMOSOME_LENGTH];int[] child2 = new int[CHROMOSOME_LENGTH];System.arraycopy(parent1, 0, child1, 0, crossoverPoint);System.arraycopy(parent2, crossoverPoint, child1, crossoverPoint, CHROMOSOME_LENGTH - crossoverPoint);System.arraycopy(parent2, 0, child2, 0, crossoverPoint);System.arraycopy(parent1, crossoverPoint, child2, crossoverPoint, CHROMOSOME_LENGTH - crossoverPoint);return new int[][] {child1, child2};}// 变异操作private static void mutate(int[] chromosome) {for (int i = 0; i < CHROMOSOME_LENGTH; i++) {if (random.nextDouble() < MUTATION_RATE) {chromosome[i] = 1 - chromosome[i]; // 0变1,1变0}}}// 遗传算法主函数public static void geneticAlgorithm() {// 初始化种群int[][] population = new int[POPULATION_SIZE][CHROMOSOME_LENGTH];for (int i = 0; i < POPULATION_SIZE; i++) {population[i] = generateChromosome();}// 进化过程for (int generation = 1; generation <= MAX_GENERATIONS; generation++) {// 选择父代int[][] parents = selectParents(population);// 交叉操作int[][] offspring = crossover(parents[0], parents[1]);// 变异操作for (int[] child : offspring) {mutate(child);}// 更新种群population = offspring;// 输出每一代的最优解int maxFitness = 0;for (int[] chromosome : population) {int fitness = calculateFitness(chromosome);if (fitness > maxFitness) {maxFitness = fitness;}}System.out.println("Generation " + generation + ", Max Fitness: " + maxFitness);}}// 测试函数public static void main(String[] args) {geneticAlgorithm(); // 执行遗传算法}
}
3. 模拟退火算法(Simulated Annealing)
模拟退火算法是一种基于物理学原理的启发式算法,通过随机扰动和接受劣解的概率来逐步减小系统温度,从而搜索解空间中的最优解。模拟退火算法适用于解决组合优化、函数优化等问题。以下是模拟退火算法的Java实现及测试:
import java.util.Random;public class SimulatedAnnealing {// 目标函数,这里以一个简单的示例函数为例public static double objectiveFunction(double x) {return Math.sin(x) / x;}// 模拟退火算法实现public static double simulatedAnnealing(double initialTemperature, double coolingRate, double minValue, double maxValue) {Random rand = new Random();double currentSolution = rand.nextDouble() * (maxValue - minValue) + minValue; // 初始解double temperature = initialTemperature; // 初始温度while (temperature > 0.1) { // 设定停止条件double newSolution = currentSolution + (rand.nextDouble() * 2 - 1); // 随机扰动double currentEnergy = objectiveFunction(currentSolution);double neighborEnergy = objectiveFunction(newSolution);if (neighborEnergy > currentEnergy || rand.nextDouble() < Math.exp((currentEnergy - neighborEnergy) / temperature)) {currentSolution = newSolution; // 接受劣解}temperature *= 1 - coolingRate; // 降低温度}return currentSolution;}public static void main(String[] args) {double initialTemperature = 1000; // 初始温度double coolingRate = 0.03; // 温度衰减率double minValue = -10; // 解的最小值范围double maxValue = 10; // 解的最大值范围double result = simulatedAnnealing(initialTemperature, coolingRate, minValue, maxValue);System.out.println("Simulated Annealing Result: " + result);System.out.println("Objective Function Value: " + objectiveFunction(result));}
}
结论
启发式算法是解决复杂问题的有效工具,常用于那些难以找到最优解的问题。本文介绍了贪心算法、遗传算法和模拟退火算法的原理及Java实现,并提供了相应的测试代码。读者通过学习本文,可以深入了解这些常用的启发式算法,并在实际项目中灵活运用,提高问题解决的效率和准确性。
感谢您阅读本文,欢迎“一键三连”。作者定会不负众望,按时按量创作出更优质的内容。
❤️ 1. 毕业设计专栏,毕业季咱们不慌,上千款毕业设计等你来选。
相关文章:
常用的启发式算法:探索问题解决的智慧之道
启发式算法是一种通过启发式信息来引导搜索的算法,常用于解决那些在合理时间内难以找到最优解的问题。本文将介绍几种常用的启发式算法,包括贪心算法、遗传算法和模拟退火算法,并提供Java代码实现及测试,帮助读者深入理解这些算法…...
docker Harbor私有仓库部署管理
搭建本地私有仓库,但是本地私有仓库的管理和使用比较麻烦,这个原生的私有仓库并不好用,所以我们采用harbor私有仓库,也叫私服,更加人性化。 一、什么是Harbor Harbor是VWware 公司开源的企业级Docker Registry项…...
序列化的不同格式:JSON、XML、TOML、CSON、YAML
前言 这篇文章参考于知乎,进行了一些总结。 正文 首先什么是序列化,数据序列化是从一个系统获取一些信息,将其转换为其它系统可以读取的格式,然后将其传递给其它系统的过程。也就是可以让不同系统“通信”。 序列化需要满足两…...
Mapreduce | 案例
根据提供的数据文件【test.log】 数据文件格式:姓名,语文成绩,数学成绩,英语成绩 完成如下2个案例: (1)求每个学科的平均成绩 (2)将三门课程中任意一门不及格的学生过滤出来 (1)求每…...
U盘文件剪切丢失怎么办?揭秘原因并给出恢复方法
在日常生活和工作中,U盘已成为我们不可或缺的数据存储和传输工具。但有时候,我们在对U盘中的文件进行剪切操作时,会遇到文件丢失的情况。这种突如其来的数据消失往往会让人感到惊慌和困惑。那么,为什么U盘剪切时文件会丢失呢&…...
软件设计师考试---访问控制列表、堆,栈和堆栈、防火墙、数据流图、嵌入式操作、绑定方式、uml、模式、传输协议
访问控制列表 访问控制列表(Access Control List,ACL) 是一种用于控制对资源(如文件、目录、网络资源等)访问权限的方法。ACL是在计算机安全领域广泛使用的概念,它允许系统管理员定义哪些用户或系统进程有…...
vlock工具:锁定Linux终端的安全智能方法
虚拟控制台是 Linux 非常重要的功能,它们为系统用户提供 shell 提示,以非图形设置方式使用系统,该设置只能在物理机上使用,而不能远程使用。 用户只需从一个虚拟控制台切换到另一个虚拟控制台即可同时使用多个虚拟控制台会话。 …...
【Linux】Docker 安装部署 Nacos
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 【Linux】Docker 安装部署 Nacos docker搜索na…...
纯血鸿蒙APP实战开发——阅读翻页方式案例
介绍 本示例展示手机阅读时左右翻页,上下翻页,覆盖翻页的功能。 效果图预览 使用说明 进入模块即是左右翻页模式。点击屏幕中间区域弹出上下菜单。点击设置按钮,弹出翻页方式切换按钮,点击可切换翻页方式。左右翻页方式可点击翻…...
如何从Mac电脑恢复任何删除的视频
Microsoft Office是包括Mac用户在内的人们在世界各地创建文档时使用的最佳软件之一。该软件允许您创建任何类型的文件,如演示文稿、帐户文件和书面文件。您可以使用 MS Office 来完成。所有Microsoft文档都可以在Mac上使用。大多数情况下,您处理文档&…...
【Halcon 内存泄漏记录 - C#】
Halcon 内存泄漏记录 - C# 1. Bitmap 转 HImage2. new 之后要Dispose()3. 切换配方后,内存会增加4. Parallel.For 嵌套Parallel.For, 会出现问题5. 图像预处理使用需要注意不能直接在原有变量上赋值 1. Bitmap 转 HImage 由于Bitmap 在转化时使用Bitmap…...
MT8370_联发科MTK8370(Genio 510)芯片性能规格参数
MT8370芯片是一款利用超高效的6nm制程工艺打造的边缘AI平台,具有强大的性能和功能。这款芯片集成了六核CPU(2x2.2 GHz Arm Cortex-A78 & 4x2.0 GHz Arm Cortex-A55)、Arm Mali-G57 MC2 GPU、集成的APU(AI处理器)和DSP,以及一个HEVC编码加速引擎&…...
【Qt 学习笔记】Qt常用控件 | 多元素控件 | Table Widget的说明及介绍
博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 多元素控件 | Table Widget的说明及介绍 文章编号&#…...
ES全文检索支持拼音和繁简检索
ES全文检索支持拼音和繁简检索 1. 实现目标2. 引入pinyin插件2.1 编译 elasticsearch-analysis-pinyin 插件2.2 安装拼音插件 3. 引入ik分词器插件3.1 已有作者编译后的包文件3.2 只有源代码的版本3.3 安装ik分词插件 4. 建立es索引5.测试检索6. 繁简转换 1. 实现目标 ES检索时…...
【DDR 终端稳压器】Sink and Source DDR Termination Regulator [C] S0 S1 S2 S3 S4 S5 6状态
TPS51200A-Q1 器件通过 EN 功能提供 S3 支持。EN引脚可以连接到终端应用中的SLP_S3信号。当EN 高电平(S0 状态)时,REFOUT 和 VO 引脚均导通。当EN 低电平(S3状态)时,VO引脚关断并通过内部放电MOSFET放电时…...
使用IIS部署Vue项目
前提 使用IIS部署Vue项目,后端必须跨域,不要在Vue中用proxy跨域,那个只在dev环境中有用! IIS安装,不用全部打勾,有些他默认就是方块 ■ 选择性安装的,就维持原样就可以。 添加网站配置 右键…...
QT+多线程TCP服务器+进阶版
针对之前的服务器,如果子线程工作类里面需要使用socket发送消息,必须要使用信号与槽的方法, 先发送一个信号给父进程,父进程调用socket发送消息(原因是QT防止父子进程抢夺同一资源,因此直接规定父子进程不能…...
Java入门基础学习笔记12——变量详解
变量详解: 变量里的数据在计算机中的存储原理。 二进制: 只有0和1, 按照逢2进1的方式表示数据。 十进制转二进制的算法: 除二取余法。 6是110 13是1101 计算机中表示数据的最小单元:一个字节(byte&…...
bitmap requires a valid src attribute
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、问题记录四、 推…...
Java刷题-基础篇
目录 题目1:打印1~100内奇数和、偶数和 题目2:计算5的阶乘 题目3:计算 1!2!3!4!5! 的和 题目4:找1~100之间即能被3整除,又能被5整除的数字,要求必须使用break/continue 题目5:实现猜数字小…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
