人工智能-模拟退火算法解决旅行商问题

本次代码有参考
[https://github.com/Houchangxi/heuristic-algorithm/blob/master/TSP%E9%97%AE%E9%A2%98%E6%A8%A1%E6%8B%9F%E9%80%80%E7%81%AB/Simulated%20Annealing.py]
新解的产生:采用两个城市间的逆序交换方式得到问题的一个新解。
假要逆序交换的城市是𝝅𝒖,𝝅𝒗(𝒖 < 𝒗, 𝟏 ≤ 𝒖, 𝒗 < 𝒏 + 𝟏)
先:𝝅1 → 𝝅𝟐 → ⋯ → 𝝅𝒖−𝟏 → 𝝅𝒖 → 𝝅𝒖+𝟏 → ⋯ → 𝝅𝒗−𝟐 → 𝝅𝒗−𝟏 → 𝝅𝒗 → 𝝅𝒗+𝟏 → ⋯ → 𝝅𝒏
后:𝝅1 → 𝝅𝟐 → ⋯ → 𝝅𝒖−𝟏 → 𝝅𝒖 → 𝝅𝒗−𝟏 → 𝝅𝒗−𝟐 → ⋯ → 𝝅𝒖+𝟏 → 𝝅𝒗 → 𝝅𝒗+𝟏 → ⋯ → 𝝅𝒏
指标函数差:f=(d(u,v-1)+d(u+1,v))-(d(u,u+1)+d(v-1,v))
参数确定:选用康立山的。初始温度t0=280;在每个温度下采用固定迭代次数,Lk=100n,n为城市数;温度衰减系数=0.92,即tk+1=0.92×tk;算法终止准则为当相邻两个温度得到的解无任何变化时算法停止。
在这里提醒一下,每个老师可能要求的产生新解方式,指标函数差和初试参数都不一样,大家一定要先看清楚老师的要求再做题,选用不同的新解产生方式结果可能差的很大
代码注意一点列表复制若想新列表更改不影响原列表一定要用list.copy(),不要直接赋等值,我因为这个浪费过很长时间。算法很简单的就是要注意细节,临界值之类的,要不然可能算法写完半小时,修改代码一整天。

import numpy as np
import random
import matplotlib.pyplot as plt
import math
n= 29
def position_xy():#获取各个城市的xy值
    array1 = np.zeros((n, 2), dtype=np.double)
    with open('CityInformation.txt', 'r+') as f:
        '''for i in range(0,29):
            array1[i,:]=np.double(f.readline().split(' '))'''
        list1 = f.readlines()
        f.close()
    # a,b=list1[1].split(' ')[1],list1[1].split(' ')[2]
    # print(a,b)
    for i in range(0, n):
        array1[i, :] = np.double(list1[i].split(' '))[1], np.double(list1[i].split(' '))[2]
    return array1
def distance(array1):#计算各个城市之间的距离
    array2 = np.zeros((n, n), dtype=np.double)
    for i in range(0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值