模拟退火算法和禁忌搜索结合(SA+TS)混合算法解决TSP问题——lua实现(Microcity)
本文从TSLIB上获取实际城市坐标,写出单独使用模拟退火(SA),模拟退火和禁忌搜索结合(SA+TS)的算法流程图和各自代码结果,最后与CPLEX精确解进行比较,得出混合(SA+TS)算法在求解效率和质量上的优越性。
当时为了赶现代优化技术大作业做的并不是很完善,大家可以批评指正。MicroCity软件是我导师自己编写的软件,集成了包括GIS、DES(离散事件仿真)、3D、Optimizer、Network、PLC control等等功能于一体。下载链接:https://pan.baidu.com/s/1S7a1al1r48pCw3Zr3g0GCg 提取码:o1at
首先,在TSPLIB上获取到的burma14.tsp.gz文件,其中包含十四个城市的坐标:
混合算法流程图(Microsoft Viso绘制):
单纯使用模拟退火的代码(使用lua编写,MicroCity编译):
--Author:sts
--Date:2020.12.10
function Tsp_SA() --求解TSP-burma14问题
local T --当前温度
local T_start = 5000.0 --初始温度
local T_end = 0.00000008 --结束温度
local q = 0.98 --退火系数
local L = 1000 --每个温度最大迭代次数
local N = 14 --城市个数
local result = {
} --路径数组
local count = 0 --迭代次数
local time0 = os.clock()
local p = {
{
16,96},{
16,94},{
20,92},{
22,93},{
25,97},{
22,96},{
20,97},{
17,96},{
16,97},{
14,98},{
16,97},{
21,95},{
19,97},{
20,94}} --缅甸14座城市城市坐标
function ini() --初始化
for i = 1, N do
result[i] = i --顺序生成解空间
end
end
function distance(p1,p2) --求两点间距离
local distance = math.sqrt(math.pow(p1[1]-p2[1],2)+math.pow(p1[2]-p2[2],2))
return distance
end
function path_len(result) --路径总长度
local sum = 0
for i = 1, N-1 do
sum = sum + distance(p[result[i]],p[result[i+1]])
end
sum = sum + distance(p[result[14]],p[result[1]])
return sum
end
function create() --生成新的解空间
local new = {
}
for i = 1, N do --把旧解空间的每个值赋给新解空间
new[i] = result[i]
end
random = CreateRandEng(math.random(0,100000000),"uniform_int",1,N) --生成均匀分布1-14整数随机数,随机数种子也为随机数,以此保证每次随机数生成不同,且p1,p2不同
p1 = GetNextRandom(random)
p2 = GetNextRandom(random)
new[p1], new[p2] = result[p2], result[p1]
return new
end
function main() --主函数
ini()
T = T_start