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

启发式算法-模拟退火算法

模拟退火算法是一种基于概率的启发式优化算法,用于解决大规模组合优化问题,其灵感来源于金属退火过程中的物理现象。其基本原理是从一个初始解开始,然后在当前解的邻域内随机生成一个新解,如果新解的目标函数值优于当前解,那么就将新解作为当前解,如果新解的目标函数值比当前解差,那么以一定的概率选择新解,这个概率随着算法的进行而逐渐降低,类似于退火过程中温度逐渐降低,物质逐渐趋于稳定状态,通过这种方式算法可以在一定程度上避免陷入局部最优解,搜索到全局最优解。

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

旅行商问题
有 10 个城市A、B、C、D、E…J,旅行商需要从一个城市出发,遍历所有城市且每个城市只经过一次,最后回到起始城市,要求找到最短的旅行路线,城市距离矩阵如下,最优路线 H->I->E->A->G->B->D->F->C->J->H
在这里插入图片描述
模拟退火代码

public class SATSP {// 城市数量private static final int NUM_CITIES = 10;// 初始温度private static final double INITIAL_TEMPERATURE = 1000;// 冷却率private static final double COOLING_RATE = 0.99;// 终止温度private static final double FINAL_TEMPERATURE = 0.1;// 城市距离矩阵private static int[][] distanceMatrix;public static void main(String[] args) {// 初始化距离矩阵initializeDistanceMatrix();// 初始化路线List<Integer> currentRoute = generateInitialRoute();// 计算当前路线的距离double currentDistance = calculateDistance(currentRoute);// 初始温度double temperature = INITIAL_TEMPERATURE;// 记录最优路线List<Integer> bestRoute = new ArrayList<>(currentRoute);double bestDistance = currentDistance;// 模拟退火过程while (temperature > FINAL_TEMPERATURE) {// 生成新的邻域路线List<Integer> newRoute = getNeighborRoute(currentRoute);// 计算新路线的距离double newDistance = calculateDistance(newRoute);// 计算距离差double deltaDistance = newDistance - currentDistance;// 如果新路线更优或者满足概率条件,则接受新路线if (deltaDistance < 0 || Math.exp(-deltaDistance / temperature) > Math.random()) {currentRoute = newRoute;currentDistance = newDistance;}// 如果新路线是目前最优的,更新最优路线if (currentDistance < bestDistance) {bestRoute = new ArrayList<>(currentRoute);bestDistance = currentDistance;}// 降温temperature *= COOLING_RATE;}// 输出具体路线String routeString = convertRouteToLetters(bestRoute);System.out.println("最优路线: " + routeString);System.out.println("最短距离: " + bestDistance);}// 初始化距离矩阵private static void initializeDistanceMatrix() {distanceMatrix = new int[NUM_CITIES][NUM_CITIES];Random random = new Random();for (int i = 0; i < NUM_CITIES; i++) {for (int j = 0; j < NUM_CITIES; j++) {if (i == j) {distanceMatrix[i][j] = 0;} else {// 随机生成城市之间的整数距离distanceMatrix[i][j] = random.nextInt(100);distanceMatrix[j][i] = distanceMatrix[i][j];}}}// 距离矩阵System.out.println("城市距离矩阵:");System.out.print("  ");for (int i = 0; i < NUM_CITIES; i++) {System.out.print((char) ('A' + i) + "  ");}System.out.println();for (int i = 0; i < NUM_CITIES; i++) {System.out.print((char) ('A' + i) + " ");for (int j = 0; j < NUM_CITIES; j++) {System.out.printf("%2d ", distanceMatrix[i][j]);}System.out.println();}}// 生成初始路线private static List<Integer> generateInitialRoute() {List<Integer> route = new ArrayList<>();for (int i = 0; i < NUM_CITIES; i++) {route.add(i);}// 生成初始路线Collections.shuffle(route);return route;}// 计算路线的总距离private static double calculateDistance(List<Integer> route) {double distance = 0;for (int i = 0; i < route.size() - 1; i++) {int from = route.get(i);int to = route.get(i + 1);distance += distanceMatrix[from][to];}// 回到起点distance += distanceMatrix[route.get(route.size() - 1)][route.get(0)];return distance;}// 生成邻域路线private static List<Integer> getNeighborRoute(List<Integer> route) {List<Integer> newRoute = new ArrayList<>(route);Random random = new Random();int index1 = random.nextInt(NUM_CITIES);int index2 = random.nextInt(NUM_CITIES);// 交换两个城市的位置Collections.swap(newRoute, index1, index2);return newRoute;}private static String convertRouteToLetters(List<Integer> route) {StringBuilder sb = new StringBuilder();for (int i = 0; i < route.size(); i++) {char city = (char) ('A' + route.get(i));sb.append(city);if (i < route.size() - 1) {sb.append("->");}}// 回到起点char startCity = (char) ('A' + route.get(0));sb.append("->").append(startCity);return sb.toString();}
}

在这里插入图片描述

http://www.xdnf.cn/news/298315.html

相关文章:

  • STM32的智慧农业系统开发(uC/OS-II)
  • 如何设计Kafka的高可用跨机房容灾方案?(需要实战,未实战,纯理论)
  • 破局者手册 Ⅱ:测试开发深度攻坚,引爆质量优化新动能!
  • ES6/ES11知识点 续四
  • 【自然语言处理与大模型】LlamaIndex的词嵌入模型和向量数据库
  • 奇瑞依托汽车产业链,实现服务机器人万台下线
  • 【计算机网络 第8版】谢希仁编著 第四章网络层 地址类题型总结
  • 前端-HTML+CSS+JavaScript+Vue+Ajax概述
  • UE5 诺伊腾动捕使用笔记
  • Vue + Element UI 表单弹窗输入法卡顿问题解决方案
  • 第二章:langchain文本向量化(embed)搭建与详细教程-本地服务方式(下)
  • 2025 后端自学UNIAPP【项目实战:旅游项目】2、安装下载引用前端UI框架:uview-plus
  • OSCP - Proving Grounds - NoName
  • window 显示驱动开发-线程和同步级别一级(二)
  • 基于深度学习的图像识别技术:从原理到应用
  • 【数据挖掘】Apriori算法
  • 【愚公系列】《Manus极简入门》021-音乐创作助手:“音符魔术师”
  • 数学复习笔记 3
  • 【Part 2安卓原生360°VR播放器开发实战】第三节|实现VR视频播放与时间轴同步控制
  • iOS开发架构——MVC、MVP和MVVM对比
  • 如何开始使用 Blender:Blender 3D 初学者指南和简介 怎么下载格式模型
  • java springboot deepseek流式对话集成示例
  • UE5 材质淡入淡出
  • 【数据结构】求有向图强连通分量的方法
  • 【开发工具】Window安装WSL及配置Vscode获得Linux开发环境
  • 虚拟现实视频播放器 2.6.1 | 支持多种VR格式,提供沉浸式观看体验的媒体播放器
  • Spark,HDFS客户端操作
  • mysql中select 1 from的作用
  • 博客系统测试报告
  • 在命令行终端中快速打开npm包官网