我正嘗試使用python創建一個簡單的模擬退火搜索,但在使用math.exp計算指數時總是顯示溢出錯誤。OverflowError:數學範圍錯誤 - 指數Python
,這是我在Python代碼:
import random
import math
def getF(x1, x2):
t1 = (4 - (2.1 * (x1 ** 2) + (x1 ** 4)/3)) * (x1 ** 2)
t2 = x1 * x2
t3 = (-4 + (4 * (x2 ** 2))) * (x2 ** 2)
t = t1 + t2 + t3
return t
def getP(dE, t):
return math.exp((-1*dE)/t)
def getNewRandInRange(x):
newX = x + random.randint(-5, 5)
while (newX > 10) or (newX < -10):
newX = x + random.randint(-5, 5)
return newX
initState1 = random.randint(-10, 10)
initState2 = random.randint(-10, 10)
currentState1 = initState1
currentState2 = initState2
BSF = getF(currentState1, currentState2)
T = 1000
Tmin = 1
while T > Tmin:
print("T= %f" %T)
newState1 = getNewRandInRange(currentState1)
newState2 = getNewRandInRange(currentState2)
currentF = getF(currentState1, currentState2)
newF = getF(newState1, newState2)
print("Current X1= %f" % currentState1)
print("Current X2= %f" % currentState2)
print("New X1= %f" % newState1)
print("New X2= %f" % newState2)
dE = currentF - newF
print ("delta E: %f" %dE)
if dE > 0:
currentState1 = newState1
currentState2 = newState2
BSF = getF(newState1, newState2)
else:
randNumber = random.uniform(0, 1)
p = getP(dE, T)
if (randNumber < p):
currentState1 = newState1
currentState2 = newState2
print("BSF: %f" %BSF)
print("\n\n\n")
T = T * 0.9
print(BSF) #final output
錯誤信息:
Traceback (most recent call last):
return math.exp((-1*dE)/t)
OverflowError: math range error
我使用try和catch嘗試,但它不會返回的階數,它會使得結果的問題,我也試着用google搜索,但沒有找到任何符合我要求的解決方案。
謝謝!
可能你也發佈了錯誤追蹤記錄 –
你可以檢查( - 1 * dE)/ t,他們可能會非常大或很小 –