简介

一直以为是一个高深的算法,好像据说在量子计算机中可以应用。发现原理并不难

参考链接

https://blog.csdn.net/google19890102/article/details/45395257
https://blog.csdn.net/wfrainn/article/details/80303138

算法缺点

这个算法怎么感觉概率的地方基本不受控制,温度降到最后还是大量接受随机解?
模拟退火就是这样的,因为它到了最优解过后还能跳出最优解域,因此能找到别的解域的最优解的值。因此一定要记录下历史最优解。

算法流程图

code

对https://blog.csdn.net/wfrainn/article/details/80303138进行的代码更新

result

直接输出 39.72958243492729 -32148.550564632504
记录最小数值 40.033185051881034 -32154.066628802473

发现保留的最小值确实更接近最小值
code

#coding=utf-8
import numpy as np
from monituihuo import aimFunction
import math
T=1000 # initiate temperature
Tmin=10 # minimun value of terperature
x = np.random.uniform(low=0, high=100) # initiate x
k=50 # times of internal circulation
y = 0 # initiate result
t=0 # time
xmin = 100
ymin = 100 # 观察凸显给出的数值
while T>Tmin:
    for i in range(k):
        y=aimFunction(x)
        # generate a new x in the neighboorhood of x by transform function
        xNew = x + np.random.uniform(low=-0.055, high=0.055) * T
        if(0<=xNew and xNew <=100):
            yNew=aimFunction(xNew)
            if(yNew - y <= 0):
                x = xNew
                if(yNew < ymin):
                    xmin = x
                    ymin = yNew
            else:
                #metropolis principle
                p = math.exp(-(yNew-y) / T)
                r = np.random.uniform(low=0, high=1)
                if r < p:
                    x=xNew
    t+=1
    # print(t)
    T=(1000)/(1+t)
print('直接输出',x, aimFunction(x))
print('记录最小数值',xmin, aimFunction(xmin))
#coding=utf-8  
from __future__ import division # 将新版本的特性引入
import numpy as np
import matplotlib.pyplot as plt
import math

def aimFunction(x):
    y=x**3-60*x**2-4*x+6
    return y

x = [i/10 for i in range(1000)]
y = [0 for i in range(1000)]
for i in range(1000):
    y[i] = aimFunction(x[i])
plt.plot(x,y)
# plt.show()
posted on 2020-08-08 10:33  HDU李少帅  阅读(598)  评论(0编辑  收藏  举报