Python中求解旅行商问题的模拟退火算法

2024-10-02 06:34:45 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我尝试用模拟退火来解决旅行商问题。我得到了一个100x100矩阵,其中包含每个城市之间的距离,例如,[0][0]将包含0,因为第一个城市和它本身之间的距离是0,[0][1]包含第一个和第二个城市之间的距离,依此类推。在

我的问题是,我写的代码并没有使巡演距离最小化,它被困在一个数字范围内,并且在温度达到0之前永远无法正确最小化。我试着用爬山算法做同样的问题,结果很好,但我似乎不能用模拟退火来解决。有人能帮我看看我做错了什么吗?在

Mat = distancesFromCoords() #returns the 100x100 matrix with distances
T = 10000 #temperature
Alpha = 0.98 #decreasing factor
X = [i for i in range(99)] #random initial tour
random.shuffle(X)
X.append(X[0])    

while T > 0.01:
    Z = nuevoZ(X,Mat) #Best current solution
    Xp = copy.deepcopy(X)          
    a = random.sample(range(1,98),2)
    Xp[a[0]], Xp[a[1]] = Xp[a[1]],Xp[a[0]]   
    Zp = nuevoZ(Xp,Mat)  #Probable better solution

    decimal.setcontext(decimal.Context(prec=5))
    deltaZ = Zp - Z
    Prob = decimal.Decimal(-deltaZ/T).exp()

    print("probabilidad: ", Prob)
    print("Temperatura: ",T)
    print("Z: ",Z)
    print("Zp: ",Zp)
    print("\n")

    if Zp < Z:
        X = Xp
        T = T*Alpha
    else:
        num = randint(0,1)
        if num<Prob:
            X = copy.copy(Xp)
            T = T*Alpha

算法中使用的函数:

^{pr2}$

Tags: alpha算法距离rangerandomzpxpdecimal

热门问题