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)

大家都在看

  • 数据库事务的四大特性(ACID)

    什么是数据库事务? 事务,就是一系列操作的整体,其结果就是这一系列操作要么全部成功,要么全部失败。 譬如说,一个经典的例子–转账。A要转帐给B 100块钱,要经历以下步…

    Linux 2023年6月6日
    0100
  • Xshell中用./startup.sh启动时候提示权限不够

    授予脚本权限 chmod u+x *.sh 或者使用 chmod 777 ./service-demo.sh Original: https://www.cnblogs.com/q…

    Linux 2023年5月28日
    087
  • 【SHELL】在指定格式的文件中查找字符串

    在指定格式的文件中查找字符串 grep -nr "string" –include=*.{c,cpp,h} 在排除指定格式的文件中查找字符串 grep -nr…

    Linux 2023年5月28日
    0137
  • TCP/UDP 编程模型

    TCP编程模型 server创建socket套接字 socket套接字–可以理解为文件描述符(file descriptor),UNIX把网络看成文件 /** * @p…

    Linux 2023年6月6日
    0110
  • 并查集详解 图解引入到实现| Disjoint Sets details, intro to implementation with figures.

    Introduction of Disjoint Sets It’s easy to tell whether someone you know is your rel…

    Linux 2023年6月13日
    0114
  • 实验

    编写程序实现以下功能 编写程序,打印99乘法表 将一面额为10元倍数的整钱( 输入一行字符,统计其中单词的个数。各单词之间用空格分隔,空格数可以是多个。 输入输出示例 Input …

    Linux 2023年6月7日
    0101
  • 远程小工具PuTTY

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 PuTTY是一个Telnet、SSH、rlogin、纯TCP以及串行接口连接软件。我们连接服务器一般用ssh或者telnet,这…

    Linux 2023年5月27日
    0108
  • Shell脚本之while read line的用法

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    0101
  • JS 模块化- 05 ES Module & 4 大规范总结

    1 ES Module 规范 ES Module 是目前使用较多的模块化规范,在 Vue、React 中大量使用,大家应该非常熟悉。TypeScript 中的模块化与 ES 类似。…

    Linux 2023年6月6日
    0143
  • GFS-Google 文件系统

    GFS分布式文件系统 简介 GFS是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上,并提供容错功能。它可以给大量的用户提供总体…

    Linux 2023年6月13日
    095
  • Linux上安装并启动tomcat

    1、下载tomcat安装包 官网链接:https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.57/bin/ 2、将tomcat上…

    Linux 2023年6月6日
    0120
  • GIT使用说明

    1、Git入门教程 1.1:Git入门与使用 (一) Git介绍与安装 1.2:Git入门与使用 (二) Git相关命令的介绍与使用 1.3:Git入门与使用 (三) 使用GitH…

    Linux 2023年6月13日
    0113
  • 很有创意的AkShell:用JS开发web,轻松发布

    今天看了infoq对作者的采访,感觉很有意思。 我去他们的网站看了下,作者是俄罗斯人,他的目标是最大可能地简化web开发。只需要用浏览器就可以开发 ,点两下鼠标就发布了。 他的哲学…

    Linux 2023年5月28日
    0101
  • pyQt的基本使用

    1. 基本窗口 import sys from PyQt5.QtWidgets import QApplication, QWidget if __name__ == ‘__mai…

    Linux 2023年6月7日
    0120
  • 在 IconFont 上获取图标资源的操作方法与感悟

    如何在 IconFont 上获取图标资源 阿里巴巴矢量图标库网站(https://www.iconfont.cn/)上提供了非常丰富的图标资源,包括 SVG、AI、PNG、字体图标…

    Linux 2023年6月7日
    0114
  • 建表参数PCTFREE、PCTUSED、INITRANS和MAXTRANS释疑

    PCTFREE与PCTUSED建表时可以指定以上两个参数的值(整数),PCTFREE表示一个块中保留的剩余空间大小百分比,该保留空间主要用于已有记录的更 新操作;PCTUSED表示…

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