模拟退火
算法相关参数
- 初始温度:T0
- 当前温度:t
- 结束温度:Tend
- 迭代次数:Times
- 温度衰减系数:a
- 目标函数差值(当前解和新解之间的函数差值):δ
- 接受新解的概率 :p = e-(δ/t)
算法效果分析
- 迭代次数越多,温度衰减系数约大(即温度衰减得越慢),搜索次数越多,程序运行越慢,相对来 得到的解更可信
- “ 渣 男 ” 套 路 : 前 期 广 撒 网 , 后 期 精 准 打 击 。 \color{red}{“渣男”套路:前期广撒网,后期精准打击。} “渣男”套路:前期广撒网,后期精准打击。模拟退火算法前期要增加接受新解的概率,以便于扩大我们的搜索范围,避免陷入局部最优解;算法后期要减少接受新解的概率,避免丢弃当前最优解
- 目标函数差值越大,接受新解的概率越大;随着迭代次数的增加,温度t逐渐减小,接受新解的概率越小
算法步骤
- 数据初始化:计算距离矩阵(dist[i][j]表示i城市与j城市之间的距离);随机得到初始解(起点为0城市);编写距离计算函数
- 在每个温度下,进行Times次迭代
- 每次迭代时:求得新路径并计算其路径长度(通过二次变换法和数据切片交换来求得新解)
- 若得到的新路径长度小于当前路径长度,则更新当前路径和当前路径长度,若与此同时新路径长度还优于最优路径长度,则同时更新最优路径及其长度
- 模拟退火算法的核心:若得到的新路径长度大于等于当前路径长度,则根据相应函数计算概率,通过随机数和此时的概率相比较,从而决定是否接收新路径(即劣解)
- 直到当前温度小于结束温度时,算法结束
- 调参来优化模型
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],