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

启发式算法-禁忌搜索算法

禁忌搜索是一种可以用于解决组合优化问题的启发式算法,通过引入记忆机制跳出局部最优,避免重复搜索。该算法从一个初始解开始,通过邻域搜索策略来寻找当前解的邻域解,并在邻域解中选择一个最优解作为下一次迭代的当前解,为了避免算法陷入局部最优,引入禁忌表来记录已经访问过的操作,禁止算法在一定迭代次数内再次选择这些被禁忌的操作,另外算法可以设置一些特赦条件,使得被禁忌的操作可以解除禁忌,从而探索更优的解空间。

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

旅行商问题
假设有 4 个城市A、B、C、D,旅行商需要从一个城市出发,遍历所有城市且每个城市只经过一次,最后回到起始城市,要求找到最短的旅行路线,城市距离矩阵如下,最短的旅行路线为 A → B → D → C → A
在这里插入图片描述

禁忌搜索代码

public class TabuSearchTSP {// 城市距离矩阵private static final int[][] DISTANCE_MATRIX = {{0, 2, 9, 10},{2, 0, 6, 4},{9, 6, 0, 8},{10, 4, 8, 0}};private static final int NUM_CITIES = 4;      // 城市数量private static final int TABU_TENURE = 2;     // 禁忌表长度private static final int MAX_ITERATIONS = 100; // 最大迭代次数public static void main(String[] args) {int[] bestSolution = tabuSearch();System.out.println("最优路径: " + formatPath(bestSolution));System.out.println("最短距离: " + calculateDistance(bestSolution));}private static String formatPath(int[] path) {String[] cities = {"A", "B", "C", "D"};StringBuilder sb = new StringBuilder();for (int idx : path) {sb.append(cities[idx]).append(" → ");}sb.append(cities[0]);return sb.toString();}// 禁忌搜索核心算法private static int[] tabuSearch() {// 初始化解int[] currentSolution = generateInitialSolution();int[] bestSolution = currentSolution.clone();int bestDistance = calculateDistance(bestSolution);// 禁忌表Queue<String> tabuList = new LinkedList<>();// 迭代搜索for (int iter = 0; iter < MAX_ITERATIONS; iter++) {int[] bestCandidate = null;int bestCandidateDist = Integer.MAX_VALUE;String move = null;// 生成邻域解for (int i = 1; i < NUM_CITIES; i++) {for (int j = i+1; j < NUM_CITIES; j++) {// 避免重复交换String swapKey = i + "-" + j;// 生成候选解int[] candidate = currentSolution.clone();swap(candidate, i, j);int candidateDist = calculateDistance(candidate);// 检查是否满足特赦的条件boolean isAspiration = candidateDist < bestDistance;// 选择最优候选解或者满足特赦条件的候选解if (!tabuList.contains(swapKey) || isAspiration) {if (candidateDist < bestCandidateDist) {bestCandidate = candidate.clone();bestCandidateDist = candidateDist;move = swapKey;}}}}// 更新当前解if (bestCandidate != null) {currentSolution = bestCandidate.clone();// 更新禁忌表tabuList.add(move);if (tabuList.size() > TABU_TENURE) {tabuList.poll();}// 更新全局最优解if (bestCandidateDist < bestDistance) {bestSolution = bestCandidate.clone();bestDistance = bestCandidateDist;}}}return bestSolution;}private static int[] generateInitialSolution() {int[] solution = new int[NUM_CITIES];for (int i = 0; i < NUM_CITIES; i++) {solution[i] = i;}return solution;}private static void swap(int[] array, int i, int j) {int temp = array[i];array[i] = array[j];array[j] = temp;}// 计算路径总距离private static int calculateDistance(int[] path) {int distance = 0;for (int i = 0; i < NUM_CITIES; i++) {int from = path[i];int to = path[(i+1)%NUM_CITIES];distance += DISTANCE_MATRIX[from][to];}return distance;}
}

在这里插入图片描述

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

相关文章:

  • Python学习之路(七)-绘画and动画
  • 使用 JavaScript 实现数据导出为 Excel 和 CSV 文件
  • Ultra7-265K 和 技嘉Z890M-AORUS-ELITE-WIFI7主板 简单开箱测评
  • 《Python星球日记》第29天:Flask进阶
  • Unity-Shader详解-其四
  • python计算shp中每个区域的面积
  • Linux 怎么使用局域网内电脑的网络访问外部
  • android-ndk开发(6): 查看反汇编
  • 《算法导论(第4版)》阅读笔记:p7-p8
  • 售前赢单评分是越权吗?
  • 第二章-猜数游戏
  • 数据集-目标检测系列- 牙刷 检测数据集 toothbrush >> DataBall
  • 分析strtol(),strtoul()和strtod()三个函数的功能
  • 字符串哈希专题
  • 架构进阶:什么是数据架构,如何理解数据架构?(华为)
  • 从0开始学习大模型--Day01--大模型是什么
  • 什么是开放数据湖(Open Data Lake)?
  • 十大排序算法全面解析(Java实现)及优化策略
  • Kotlin 作用域函数全解析:let、run、with、apply、also 应该怎么选?
  • C++演讲比赛案例代码
  • [人机交互]理解与概念化交互
  • 小工具功能强大,非常优秀!​
  • 「Mac畅玩AIGC与多模态20」开发篇16 - 使用结构化输出字段控制后续流程示例
  • 基于STM32F103C8T6驱动WS2812彩灯模块点亮RGB灯
  • 布隆过滤器
  • Qt学习笔记
  • SVD降维详解
  • 领略算法真谛: 多源bfs
  • 设一个测试情境,新用户注册后显示的名字不完整,测试思路是怎么样的?
  • 项目实战-基于信号处理与SVM机器学习的声音情感识别系统