一,簡介
退火算法不言而喻,就是鋼鐵在淬煉過程中失溫而成穩定態時的過程,熱力學上溫度(內能)越高原子態越不穩定,而溫度有一個向低溫區輻射降溫的物理過程,當物質內能不再降低時候該物質原子態逐漸成為穩定有序態,這對我們從隨機復雜問題中找出最優解有一定借鑒意義,將這個過程化為算法,具體參見其他資料。
二,計算方程
我們所要計算的方程是f(x) = (x - 2) * (x + 3) * (x + 8) * (x - 9),是一個一元四次方程,我們稱為高次方程,當然這個函數的開口是向上的,那么在一個無限長的區間內我們可能找不出最大值點,因此我們嘗試在較短區間內解最小值點,我們成為最優解。
解法1:
毫無疑問,數學方法多次求導基本可以解出,但是這個過程較復雜,還容易算錯,我就不贅述了,讀者有時間自己可以嘗試解一下。
解法二:
這個解法就是暴力解決了,我們這里只求解區間[-10,10]上的最優解,直接隨機200個點,再除以10(這樣可以得到非整數橫坐標),再依此計算其縱坐標f(x),min{f(x)}一下,用list的index方法找出最小值對應位置就行了,然后畫出圖形大致瞄一瞄。
直接貼代碼:
import random import matplotlib.pyplot as plt list_x = [] # for i in range(1): # #print(random.randint(0,100)) # for i in range(0,100): # print("sss",i) # # list_x.append(random.randint(0,100)) for i in range(-100,100): list_x.append(i/10) print("橫坐標為:",list_x) print(len(list_x)) list_y = [] for x in list_x: # print(x) #y = x*x*x - 60*x*x -4*x +6 y = (x - 2) * (x + 3) * (x + 8) * (x - 9) list_y.append(y) print("縱坐標為:",list_y) #經驗證,這里算出來的結果6.5和最優解1549都是對的 print("最小值為:",min(list_y)) num = min(list_y) print("最優解:",list_y.index(num)/10) print("第",list_y.index(num)/10-10,"個位置取得最小值") plt.plot(list_x, list_y, label='NM') #plt.plot(x2, y2, label='Second Line') plt.xlabel('X') #橫坐標標題 plt.ylabel('Y') #縱坐標標題 #plt.title('Interesting Graph/nCheck it out',loc="right") #圖像標題 #plt.title('Interesting Graph/nCheck it out') plt.legend() #顯示Fisrt Line和Second Line(label)的設置 plt.savefig('C:/Users/zhengyong/Desktop/1.png') plt.show()
得到如下結果:
那么我們得出最優解的坐標是(6.5,-1549.6875),結果先放這里,接下來用退火算法看能不能解出。
解法三:
我們看一張圖(解法二中的方法得出的圖),然后講講退火算法的最核心的思想。
首先,先隨機一個[-10.10]之間的隨機解,作為初始解空間,比方說隨機了一個位于[-2.5.2.5]中最高的那個點就是點1(橫坐標為x1),他有對于的縱坐標的值y1,這時候我們把這個點的橫坐標隨機加或者減去一個值(注意這個值的大小很重要,我們先叫他隨機移動值),加或者減后得到新的橫坐標的值x2,再算出這個橫坐標的對應縱坐標(y2),對比之前的縱坐標的大小,這里設置
新聞熱點
疑難解答