【启发式算法】Python实现模拟退火算法求解TSP问题

模拟退火

算法相关参数

  • 初始温度:T0
  • 当前温度:t
  • 结束温度:Tend
  • 迭代次数:Times
  • 温度衰减系数:a
  • 目标函数差值(当前解和新解之间的函数差值):δ
  • 接受新解的概率 :p = e-(δ/t)

算法效果分析

  1. 迭代次数越多,温度衰减系数约大(即温度衰减得越慢),搜索次数越多,程序运行越慢,相对来 得到的解更可信
  2. “ 渣 男 ” 套 路 : 前 期 广 撒 网 , 后 期 精 准 打 击 。 \color{red}{“渣男”套路:前期广撒网,后期精准打击。} 广模拟退火算法前期要增加接受新解的概率,以便于扩大我们的搜索范围,避免陷入局部最优解;算法后期要减少接受新解的概率,避免丢弃当前最优解
  3. 目标函数差值越大,接受新解的概率越大;随着迭代次数的增加,温度t逐渐减小,接受新解的概率越小

算法步骤

  1. 数据初始化:计算距离矩阵(dist[i][j]表示i城市与j城市之间的距离);随机得到初始解(起点为0城市);编写距离计算函数
  2. 在每个温度下,进行Times次迭代
  3. 每次迭代时:求得新路径并计算其路径长度(通过二次变换法和数据切片交换来求得新解)
  4. 若得到的新路径长度小于当前路径长度,则更新当前路径和当前路径长度,若与此同时新路径长度还优于最优路径长度,则同时更新最优路径及其长度
  5. 模拟退火算法的核心:若得到的新路径长度大于等于当前路径长度,则根据相应函数计算概率,通过随机数和此时的概率相比较,从而决定是否接收新路径(即劣解)
  6. 直到当前温度小于结束温度时,算法结束
  7. 调参来优化模型
# -*- coding: utf-8 -*-
import random
import matplotlib.pyplot as plt
import numpy as np
import math
import sys
import copy
import time
#解决中文显示问题
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
# 初始温度,结束温度
T0 = 100
Tend = 1e-20
#循环控制常数,迭代次数
Times = 50000
# 温度衰减系数
a = 0.999

#原始数据
coordinates = np.array([[565.0,575.0],[25.0,185.0],[345.0,750.0],[945.0,685.0],[845.0,655.0],
                        [880.0,660.0],[25.0,230.0],[525.0,1000.0],[580.0,1175.0],[650.0,1130.0],
                        [1605.0,620.0],
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值