模拟退火算法求解TSP问题
前言:模拟退火(simulated annealing)技术,在每一步都以一定的概率接受比当前结果更差的结果,从而有助于“跳出”局部极小。在每次迭代过程中,接受“次优解”的概率要随着时间的推移而逐渐降低,从而保证算法的稳定性。
嘻嘻嘻,推荐一篇好文章让你快速学习模拟退火算法求解旅行商问题
作者用的是c++编写的程序,而且作者在程序中设置的是每个城市的坐标,也就默认city a 到city b的距离和city b 到city a的距离一样了,和老师题目要求的用非对称矩阵来描述城市之间的距离是不一样的。
下面我参考作者代码,按老师的要求(A-B的距离不等于 B-A的距离)用 python 实现了TSP问题,其中参数也调了调。
不得不说,python真是个简单便捷的语言呢!!!
'''
设有n个城市和距离矩阵D=[dij],
其中dij表示城市i到城市j的距离,i,j=1,2 … n,
则问题是要找出遍访每个城市恰好一次的一条回路并使其路径长度为最短。
'''from time import time
from copy import copy
from numpy import exp
import numpy as np
import randomT0 = 10.0 # 初始温度
T_end = 0.001 # 最低温度
q = 0.98 # 退火系数
L = 10 # 每个温度时的迭代此时,即链长
N = 5 # 城市数量
city_list = [i for i in range(N)] # 初始化一个解
city_dis = np.floor(10 * np.random.random((N, N)) + 1) # 城市之间的距离矩阵# 计算路径长度
def path_len(path_list):path = 0for i in range(len(path_list) - 1):city1 = path_list[i]city2 = path_list[i + 1]dis = city_dis[city1][city2]path += dislast_city = path_list[-1]first_city = path_list[0]dis = city_dis[last_city][first_city]path += disreturn path# 采用随机交换位置的方式产生新解
def create_new():pos1 = random.randint(0, N - 1) # randint闭区间pos2 = random.randint(0, N - 1)temp = city_list[pos1]city_list[pos1] = city_list[pos2]city_list[pos2] = tempif __name__ == '__main__':t1 = time()count = 0 # 记录降温次数T = T0city_list_copy = [] # 保存原始解while T > T_end: # 当温度低于结束温度时,退火结束for i in range(L):city_list_copy = copy(city_list) # 复制数组create_new() # 产生新解f1 = path_len(city_list_copy) # 初始解目标函数值f2 = path_len(city_list) # 新解目标函数值df = f2 - f1# Metropolis 准则if df >= 0:print("df:", df)print("exp:", exp(-df / T))if exp(-df / T) <= random.random(): # 保留原来解city_list = copy(city_list_copy)T *= q # 降温count += 1t2 = time()print("城市之间的距离矩阵:\n", city_dis)print("模拟退火算法,初始温度T0=%.2f,降温系数q=%.2f,每个温度迭代%d次,共降温%d次\n" % (T0, q, L, count))print("TSP最优路径为:", city_list)print("最优路劲长度为:%1f\n" % (path_len(city_list)))print("程序耗时:%1f秒\n" % (t2 - t1))
结果:
模拟退火算法求解TSP问题相关推荐
- 用模拟退火算法求解TSP问题
模拟退火算法是一种基于MonteCarlo迭代求解策略的一种随机寻优算法.该算法从某一较高初温出发,伴随温度参数的不断下降,结合概率的突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概 ...
- 模拟退火算法求解TSP问题(python)
- matlab算法大全 pdf_遗传模拟退火算法求解旅行商(TSP)问题
hello大家好,很高兴又和大家见面了.在之前的遗传算法(GA)求解旅行商问题(TSP)MATLAB代码讲解和模拟退火(SA)算法求解旅行商 (TSP)问题MATLAB代码讲解这两篇推文中,分别讲解了 ...
- 基于模拟退火算法的TSP算法
文章目录 一,理论基础 二,TSP问题介绍 三,思路和步骤 控制参数的设置 初始解 解变换生成新解 Metropolis准则 降温 四,MATLAB程序实现 五,结果分析 六,算法的改进 七,算法的局 ...
- 模拟退火算法求解旅行商问题(python实现)
模拟退火算法求解旅行商问题 文章目录 模拟退火算法求解旅行商问题 一.模拟退火算法原理 二.旅行商问题 1.求解思路 2.代码 总结 旅行商问题(TSP 问题).假设有一个旅行商人要拜访全国31个省会 ...
- 蚁群算法求解TSP问题的源代码
蚁群算法求解TSP问题的源代码 分类: 智能算法2014-05-07 17:25 524人阅读 评论(1) 收藏 举报 蚁群算法 TSP win32程序设计 旅行商问题大都是用遗传算法求解,不过蚁群算 ...
- 《MATLAB智能算法30个案例》:第19章 基于模拟退火算法的TSP算法
<MATLAB智能算法30个案例>:第19章 基于模拟退火算法的TSP算法 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 <MATLAB智能算法30个案例分析&g ...
- 模拟退火算法求解旅行商问题
模拟退火算法求解旅行商问题 文章目录 模拟退火算法求解旅行商问题 旅行商(TSP)问题 一.TSP问题分析 二.模拟退火算法 1.一秒理解算法 2.算法原理 3. 算法流程 三.伪代码 四.运行结果 ...
- MATLAB模拟退火算法求解超市物流配送选址问题实例
模拟退火算法编程问题实例: MATLAB模拟退火算法求解超市物流配送选址问题实例 在范围为(0,0)到(100,100)的矩形区域内,散布着40个连锁超市,各个连锁超市的坐标及需求量见表1.要求在该矩 ...
最新文章
- 数字营销,带动汽车销量增长
- Selenium Web 自动化 - Selenium常用API
- 谷歌提出新分类损失函数:将噪声对训练结果影响降到最低
- 5.MySQL Cluster(MySQL集群)
- springboot 开发入门,及问题汇总
- 众辰变频器参数设定_电工知识:变频器使用方法设定功能参数的方法
- iOS开发之线程间的MachPort通信与子线程中的Notification转发
- 360浏览器打不开qq空间_网页突然打不开其他软件却能上网?怎么解决?
- java与java ee_Java EE MVC:处理表单验证
- 7-2 最大流 加强版 (20 分)
- mysql配置文件参数详解 my.cnf
- 作为程序员的我,接私活有错么?
- leetcode 31. Next Permutation(字典序的下一个)
- 360浏览器打不开html5文件,360浏览器打不开oa_打不开360浏览器
- 关于啤酒和尿布故事的真相
- 基于STM8L15x-16x-05x系列单片机的官方标准库文件创建第一个EWSTM8工程项目
- kibana篇之数据探索Discover
- 机器学习--决策树理论知识(二)
- 浅谈化合物数据管理的重要性
- 史上最强的绕口令,吐血也读不出
热门文章
- mysql开启慢查询日志及查询--windows
- 解析一个C语言俄罗斯方块游戏,包你看了就会
- DataWhale组队-Pandas(下)缺失数据(打卡)
- 过拟合问题——正则化方法
- java 检索ldap,从LDAP(Java)检索信息
- php文件上传后没有打开权限_记墨者靶机文件上传(二)
- 计算机辅助翻译专业院校,2017年北大计算机辅助翻译考研经验分享
- php中get_featured_posts()是什么意思,WordPress的Get_Posts()函数详解
- 删除一行下方单元格上移_快速删除Excel工作表多余空单元格
- 三、数据预处理——处理分类型数据:编码与哑变量