SA算法:从MTSP问题出发

之前我在这篇博文中介绍了解决MTSP问题的相关思路,并附上了GitHub上的相关源码。在这篇文章中,我将详细介绍如何使用SA智能优化算法进行编程

1. SA算法的核心思路:

SA(Simulated Annealing)——模拟退火算法。

SA快速入门视频推荐:https://www.bilibili.com/video/BV1j64y1Y7FB

SA算法的核心是要理解 T 在优化过程的作用。

  • T越大,越包容,可以接受看似不那么优的结果,从而跳出局部最优情况;
  • T越小,越局限,只能接受比自己更优的结果,从而更快达到最优解。

在SA算法进行的过程中 T 会逐渐变小(例如以这种形式: T = 0.95 * T)。可以理解为:SA算法进行的过程是:从”跳出局部最优解”优先;到”求解最优解”优先。

2. 是否接收不那么优的解?

#(伪代码)
p_accept = math.exp(-(new - current) / T) //接受概率
p = random.random()  //生成随机值
if p < p_accept:
    solution = new

以上代码实现了,对较差解的一个选择评估。其依赖的函数如下,对应上方代码的第一句:

SA算法:从MTSP问题出发

3. 使用SA求解MTSP问题的代码实现

  • 初始化—— 固定温度最优解全局最优解
  • 开始进行模拟退火,每个温度下循环一定次数(300次)
  • 如果更优直接更新当前值;如果更差按照公式取概率判断是否更新。
  • 更新温度,进入下一次退火
  • 更新 固定温度最优解与 *全局最优解

SA的详细过程如下(作为SA类中的函数),理解即可,不必纠结每个函数的实现。

   def sa_process_iterator(self, solution, get_distance_func):
        while self.T > self.T_end:
            # 每个温度下最优解都要赋值
            self.per_iter_solution = solution
            # 在每个温度下迭代
            for _ in range(self.Lk):
                # 当前解的目标函数值
                current_solu_obj = self.object_func(solution)
                # 产生新解
                new_solu = self.generate_new_solu(solution)
                # 新解目标函数值
                new_solu_obj = self.object_func(new_solu)
                # 新解更优,接受新解
                if new_solu_obj < current_solu_obj:
                    solution = new_solu
                # Metropolis准则
                else:
                    prob_accept = math.exp(-(new_solu_obj - current_solu_obj) / self.T)
                    p = random.random()
                    if p < prob_accept:
                        solution = new_solu
            # 该温度下迭代完成
            solu_obj = self.object_func(solution)
            # 解和该温度下最优解比较
            if solu_obj < self.object_func(self.per_iter_solution):
                self.per_iter_solution = solution
            # 解和全局最优解比较
            if solu_obj < self.object_func(self.best_solution):
                self.best_solution = solution
            # 记录每个温度下最优解和全局最优解
            self.all_per_iter_solution.append(self.per_iter_solution)
            self.all_best_solution.append(self.best_solution)

            per_iter_solu_path, per_iter_solu_dis = get_distance_func(self.per_iter_solution)
            best_solu_path, best_solu_dis = get_distance_func(self.best_solution)

            # *******************有关参数更新****************************
            self.T_list.append(self.T)
            self.T = self.T * self.alpha

Original: https://www.cnblogs.com/litecdows/p/16563473.html
Author: litecdows
Title: SA算法:从MTSP问题出发

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/609964/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • PHP获取前一天,前一个月,前半年,前一年的时间戳

    // 获取前一秒 strtotime("-1 seconds"); // 获取前一分钟 strtotime("-1 minute"); //…

    Linux 2023年6月13日
    0166
  • 011 Linux 打包与解压 tar

    01 压缩、打包命令有哪些? Linux上有着各种压缩、打包的工具:tar、gzip、zip、7z,而 tar 应该算是 Linux 官宣的压缩工具了。tar 的核心压缩工具其实是…

    Linux 2023年5月27日
    076
  • 在使用amoeba连接数据库时,报错java.lang.Exception: poolName=slaves, no valid pools

    搭建3台MySQL服务器,完成主从复制,搭建一台amoeba服务器,完成MySQL的读写分离 问题描述: 问题1、 在服务搭建完毕后,利用客户机连接amoeba服务器登录数据库,无…

    Linux 2023年6月13日
    078
  • Ubuntu 进程 线程 查看 设置(top taskset)

    top 的基本使用 taskset 的基本使用 top top 详解 及 使用 top 常用的命令 taskset taskset 的基本使用 1. 显示某个进程(线程)运行所在的…

    Linux 2023年6月6日
    0112
  • Redis

    当你的才华不能撑起你的野心时,就是你该选择学习的时候了! Original: https://www.cnblogs.com/hofmann/p/16056013.htmlAuth…

    Linux 2023年5月28日
    083
  • MySQL实现备份(1)

    完全备份和部分备份 冷备份、热备份、温备份 温备份适用于:myisam 热备份适用于:innodb 物理备份和逻辑备份 完全备份:备份所有数据 部分备份:只备份部分数据内容 两者第…

    Linux 2023年6月7日
    0142
  • 操作系统实现-printk

    博客网址:www.shicoder.top微信:18223081347欢迎加群聊天 :452380935 这一次我们来实现最基础,也是最常见的函数 print,大家都知道这个是可变…

    Linux 2023年6月13日
    0102
  • linux-查看公钥的指纹值或者部署密钥的指纹值

    背景 查看gitlab上面的[部署密钥],看到了指纹 [xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx],怎么知道这个部署密钥的指纹…

    Linux 2023年6月6日
    0107
  • Ubuntu修改静态IP

    转载自:https://www.cnblogs.com/xwgcxk/p/10560181.html 第一步:先获取网卡名称,输入ifconfig,如下图,我们的网卡名称为 ens…

    Linux 2023年6月8日
    070
  • 3.21 Linux PATH环境变量及作用(初学者必读)

    在讲解 PATH 环境变量之前,首先介绍一下 which 命令,它用于查找某个命令所在的绝对路径。例如: [root@localhost ~]# which rm /bin/rm …

    Linux 2023年6月7日
    078
  • 一文聊透 Netty IO 事件的编排利器 pipeline | 详解所有 IO 事件的触发时机以及传播路径

    欢迎关注公众号:bin的技术小屋,本文图片加载不出来的话可查看公众号原文 本系列Netty源码解析文章基于 4.1.56.Final版本 1. 前文回顾 在前边的系列文章中,笔者为…

    Linux 2023年6月6日
    094
  • 深入Go Map的使用技巧

    原文链接:https://www.zhoubotong.site/post/60.html之前写过一篇文章,Go map定义的几种方式以及修改技巧,今天发现还可以深入探讨下开发中容…

    Linux 2023年6月6日
    0116
  • 正则匹配中文

    [\u4e00-\u9fa5]+ 在线正则调试工具 posted @2022-09-14 17:21 自在拉基 阅读(17 ) 评论() 编辑 Original: https://…

    Linux 2023年6月8日
    094
  • ssh远程连接服务

    TCP/22 SSH 应用层协议 作用:远程连接设备, 方便操作 1、本地管理方式 安装系统、故障修复 2、远程连接的方式 centos7.x版本中的ssh默认是开启的,所以查看一…

    Linux 2023年6月7日
    082
  • 005.系统管理监测命令

    作者:木二 出处:http://www.cnblogs.com/itzgr/ 关于作者:云计算、虚拟化,Linux,多多交流! 本文版权归作者所有,欢迎转载,但未经作者同意必须保留…

    Linux 2023年6月7日
    096
  • 基于eNSP的NAT/NAPT协议仿真实践

    一. 基本原理 eNSP(Enterprise Network Simulation Platform)是一款由华为提供的、可扩展的、图形化 操作的网络仿真工具平台,主要对企业网络…

    Linux 2023年6月8日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球