Python 어 닐 링 알고리즘 이 고 차 방정식 에서 의 응용
8054 단어 Python어 닐 링 알고리즘고 차 방정식
어 닐 링 알고리즘 은 말 하지 않 아 도 알 수 있 듯 이 철 강 이 담금질 과정 에서 온 도 를 잃 고 안정 상태 가 되 는 과정 이다.열역학 적 온도(내 에너지)가 높 을 수록 원자 상태 가 불안정 하고 온 도 는 저온 지역 에 온 도 를 낮 추 는 물리 적 과정 이 있다.물질 내 에너지 가 더 이상 낮 아 지지 않 을 때 이 물질의 원자 태 는 점점 안정 적 이 고 질서 있 는 상태 가 된다.이것 은 우리 가 무 작위 적 이 고 복잡 한 문제 에서 가장 좋 은 해 를 찾 는 데 참고 가치 가 있 고 이 과정 을 알고리즘 으로 바 꾸 어 다른 자 료 를 구체 적 으로 참고 할 수 있다.
계산 방정식
우리 가 계산 하고 자 하 는 방정식 은 f(x)=(x-2)*(x+3)*(x+8)*(x-9)로 일원 4 차 방정식 이다.우 리 는 고 차 방정식 이 라 고 부른다.물론 이 함수 의 입 구 는 위로 향 하 는 것 이다.그러면 무한 한 긴 구간 에서 우 리 는 최대 치 점 을 찾 지 못 할 수도 있 기 때문에 우 리 는 비교적 짧 은 구간 에서 최소 치 점 을 풀 려 고 시도 한다.우 리 는 가장 좋 은 풀이 가 되 었 다.
해법 1:
의심 할 여지없이 수학 방법 이 여러 번 구 도 를 하면 기본적으로 풀 수 있 지만 이 과정 은 비교적 복잡 하고 계산 이 틀 리 기 쉬 우 므 로 나 는 군말 하지 않 겠 다.독자 가 시간 이 있 으 면 스스로 풀 어 볼 수 있다.
해법 2:
이 해법 은 폭력 으로 해 결 된 것 입 니 다.우 리 는 구간[-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
Check it out',loc="right") #
#plt.title('Interesting Graph
Check it out')
plt.legend() # Fisrt Line Second Line(label)
plt.savefig('C:/Users/zhengyong/Desktop/1.png')
plt.show()
다음 과 같은 결 과 를 얻 었 습 니 다.그러면 우리 가 가장 잘 풀 린 좌 표 는(6.5,-1549.6875)이 고 결 과 는 먼저 여기에 놓 고 그 다음 에 어 닐 링 알고리즘 으로 풀 수 있 는 지 없 는 지 를 보 자.
해법 3:
우 리 는 그림 한 장 을 본 후에 소 둔 알고리즘 의 가장 핵심 적 인 사상 을 이야기 했다.
먼저,[-10.10]사이 의 랜 덤 해 를 랜 덤 으로 하고 초기 해 공간 으로 한다.예 를 들 어[-2.5.2.5]에서 가장 높 은 점 이 바로 점 1(가로 좌 표 는 x1)이다.그 는 세로 좌표 에 대한 값 y1 이 있다.이때 우 리 는 이 점 의 가로 좌 표를 랜 덤 으로 추가 하거나 뺀 값(이 값 의 크기 가 매우 중요 하 므 로 우 리 는 먼저 그 에 게 랜 덤 으로 이동 하 라 고 한다).추가 또는 감소 후 새로운 가로 좌표 의 값 x2 를 얻 은 다음 에 이 가로 좌표 의 대응 하 는 세로 좌표(y2)를 계산 하여 이전의 세로 좌표 의 크기 를 비교 하여 여기에 설정 합 니 다.
dela=y2-y1,어쨌든 원래 의 세로 좌표 보다 작 음 을 발견 하 였 습 니 다(전 제 는 무 작위 이동 치가 충분 하 다 는 것 입 니 다).이때 우 리 는 새로 얻 은 x2 대 가 를 x1 에 게 주 었 습 니 다.이때 현재 x2 의 값 은 x1 에 전달 되 었 고 x1 은 원래 의 무 작위 값 입 니 다.이 과정 은 iter 를 반복 할 수 있 습 니 다.num 회,크기 는 자신의 구간 에 따른다.
상술 한 전체 과정 은 한 온도 에서 진행 되 는데 이 과정 이 끝 난 후에 우 리 는 온도 업데이트 공식 으로 다시 온 도 를 갱신 한 다음 에 상기 절 차 를 반복 한다.
온도 업 데 이 트 는 제 가 자주 사용 하 는 공식 은 T(t)=aT0(t-1)인 데 그 중에서 0.85QaQ 0.99 입 니 다.해당 열에너지 감쇠 공식 으로 도 계산 할 수 있 습 니 다.T(t)=T0/(1+lnt),t=1,2,3,...이것 은 모두 간단 한 상태 업데이트 방법 입 니 다.
즉,당신 이 무 작위 로 몇 개 든 나 는 최 적 화 된 방향 으로 전진 할 수 있다(전제 시비 의 가장 장점).
그 다음으로 점 2 는 같은 이치 이다.차이 점 은 그 가 국부 적 으로 가장 좋 은 것 이다.그러면 이 부분 에서 가장 좋 은 체 제 를 벗 어 나 는 것 은 무엇 일 까?
만약 에 초기 점 이(x3,y3)이 고 상기 방법 으로(x4,y4)를 얻 으 면 점 두 곳 에서 얻 은 dela 는 0 보다 클 것 이다.그러면 어떻게 할 까?0 보다 많 을 때 우 리 는 매번 일정한 확률 로 이것 을 받 아들 이 는 것 이 가장 좋 은 점 이 아니 라 Metropolis 준칙 이 라 고 하 는데 구체 적 으로 는 다음 과 같다.
여기 있 는 E 는 바로 y 이 고 T 는 현재 온도 이다.delta 가 0 보다 적 으 면 100%새로운 값 을 받 아들 이 는 것 이다.그렇지 않 은 사람 은 바로 이 확률 에 따라 받 아들 이 는 것 이다.여러 번 교체 할 때 오른쪽으로 이동 하 는 보폭 이 1 까지 누적 되면 그 는 최종 적 인 최 적 화 를 찾 을 수 있다.보폭 은 누적 되 지만 확률 은 누적 된다 는 것 은 이 확률 이 매우 작다 는 것 을 의미한다.하지만 교체 횟수 가 얼마 가 되면 가장 좋 은 곳 으로 달 려 나 올 것 이다.
가장 좋 습 니 다.점 3 은 설명 하지 않 겠 습 니 다.위 와 같 습 니 다.
그럼 코드 를 올 리 겠 습 니 다.
# (x - 2) * (x + 3) * (x + 8) * (x - 9)
#class
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import pyplot as plt
#
#T ,T_stop,iter_num ,Q
class Tuihuo_alg():
def __init__(self,T_start,iter_num,T_stop,Q,xx,init_x):
self.T_start = T_start
self.iter =iter_num
self.T_stop = T_stop
self.Q = Q
self.xx = xx
self.init_x = init_x
# def cal_x2y(self):
# return (x - 2) * (x + 3) * (x + 8) * (x - 9)
if __name__ == '__main__':
def cal_x2y(x):
#print((x - 2) * (x + 3) * (x + 8) * (x - 9))
return (x - 2) * (x + 3) * (x + 8) * (x - 9)
T_start = 1000
iter_num = 1000
T_stop = 1
Q = 0.95
K = 1
l_boundary = -10
r_boundary = 10
#
xx = np.linspace(l_boundary, r_boundary, 300)
yy = cal_x2y(xx)
init_x =10 * ( 2 * np.random.rand() - 1)
print("init_x:",init_x)
t = Tuihuo_alg(T_start,iter_num,T_stop,Q,xx,init_x)
val_list = [init_x]
while T_start>T_stop:
for i in range(iter_num):
init_y = cal_x2y(init_x)
# (2 * np.random.rand() - 1) (-1,1),
new_x = init_x + (2 * np.random.rand() - 1)
if l_boundary <= new_x <= r_boundary:
new_y = cal_x2y(new_x)
#print("new_x:",new_x)
#print('new_y:',new_y)
delta = new_y - init_y #
if delta < 0:
init_x = new_x
else:
p = np.exp(-delta / (K * T_start))
if np.random.rand() < p:
init_x = new_x
#print("new_x:",new_x)
#print(" :",T_start)
T_start = T_start * Q
print(" x :", init_x) # new_x,
print(" :", init_y)
# new_x, “init_x = new_x”
print(" x :", new_x) # new_x,
print(" :", new_y)
xx = np.linspace(l_boundary,r_boundary,300)
yy = cal_x2y(xx)
plt.plot(xx, yy, label='Tuihuo')
#plt.plot(x2, y2, label='Second Line')
plt.xlabel('X for tuihuo') #
plt.ylabel('Y for tuihuo') #
#plt.title('Interesting Graph
Check it out',loc="right") #
#plt.title('Interesting Graph
Check it out')
plt.legend() # Fisrt Line Second Line(label)
plt.savefig('C:/Users/zhengyong/Desktop/1.png')
plt.show()
여기 클 라 스 를 사 용 했 는데 필요 하지 않 은 것 같 지만 고치 고 싶 지 않 아 요.그렇게 하 세 요.가장 좋 은 결 과 는:
얻 은 설명도:
총화
어 닐 링 알고리즘 의 구체 적 인 사상 을 저 는 별로 말 하지 않 았 지만 핵심 적 인 점 을 모두 썼 습 니 다.검증 을 통 해 어 닐 링 알고리즘 은(6.55167228904226,-1548.93671426107)의 최 적 화 를 얻 었 습 니 다.해법 2 의(6.5,-1549.6875)를 보 았 습 니 다.우 리 는 하하,차이 가 많 지 않 고 오차 가 있 으 면 받 아들 일 수 있 습 니 다.물론 독자 도 몇 개의 데 이 터 를 더 뛰 어 검증 할 수 있 습 니 다.
제 실험 환경 은 Python 3.6,Numpy 1.14.3,matplotlib 2.2.2,64 비트 win 10,1709 교육 판,OS 커 널 16299.547 입 니 다.그렇게 하 겠 습 니 다.되도록 자세히 말씀 드 리 겠 습 니 다.
총결산
위 에서 말 한 것 은 소 편 이 소개 한 Python 어 닐 링 알고리즘 이 고 차 방정식 에서 의 응용 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.