混合算法(SA+TS)解决TSP问题——lua实现(Microcity)

通过在TSPLIB上获取到的burma14.tsp.gz文件,其中包含十四个城市的坐标,如图所示。模拟退火算法流程图:模拟退火算法代码(使用lua编写,MicroCity编译):function TspSA() --求解TSP-burma14问题 local T --当前温度 local T_start = 5000.0 --初始温度 local T_end = 0.00000008 --结
摘要由CSDN通过智能技术生成

模拟退火算法和禁忌搜索结合(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
        
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值