2020A炉温曲线第三题模拟退火算法(附代码)
生活随笔
收集整理的這篇文章主要介紹了
2020A炉温曲线第三题模拟退火算法(附代码)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在問題二的條件下求出面積的最小值
from matplotlib import pyplot as plt import numpy as np import random import math from 第二題 import k,T def test(v,T1,T2,T3,T4):t_list=np.linspace(0,400,801).tolist()u_list=[25]for i in t_list:kk=k(i,v)*(T(i,v,T1,T2,T3,T4)-u_list[-1])if abs(kk)>3:return Falseu_list.append(u_list[-1]+kk*0.5)u_list.pop()if len([i for i in u_list if i>=150 and i<=190])<60/0.5 or len([i for i in u_list if i>=150 and i<=190])>120/0.5:return Falseif len([i for i in u_list if i>=217])<40/0.5 or len([i for i in u_list if i>=270])>90/0.5:return Falsemax=np.array(u_list).max()if max>250 or max<240:return Falsereturn True#[start,end]為定義域 def initialization(start, end):return random.uniform(start, end) def initialication_tuple(start_list,end_list):#在定義域內構建初值while True:v=initialization(start_list[0],end_list[0])T1=initialization(start_list[1],end_list[1])T2=initialization(start_list[2],end_list[2])T3=initialization(start_list[3],end_list[3])T4=initialization(start_list[4],end_list[4])if test(v,T1,T2,T3,T4):return v,T1,T2,T3,T4 def in_range(x, start, end):return True if start <= x <= end else False def generate_new(x, start, end):while True:#采用高斯分布生成新解upper_bound = end - xlower_bound = start - xsigma = max(upper_bound, lower_bound) / 3new_x = random.gauss(x, sigma)#判斷是否在定義域內,在則返回;否則重復生成if in_range(new_x, start, end):return new_x def geerate_new_tuple(x_list,start_list,end_list):while True:#若不滿足條件則重復生成,直至滿足條件為止new_vt1t2t3t4=[generate_new(x,start,end)for x,start,end in zip(x_list,start_list,end_list)]if test(new_vt1t2t3t4[0],new_vt1t2t3t4[1],new_vt1t2t3t4[2],new_vt1t2t3t4[3],new_vt1t2t3t4[4]):return new_vt1t2t3t4def f(v,T1,T2,T3,T4):t_list=np.linspace(0,400,801).tolist()u_list=[25]for i in t_list:kk=k(i,v)*(T(i,v,T1,T2,T3,T4)-u_list[-1])u_list.append(u_list[-1]+kk*0.5)u_list.pop()list_217=[i for i in u_list if i>217]max_position=np.array(list_217).argmax()list_217=list_217[:max_position]return np.array(list_217).sum()-217*len(list_217)def search(all_vt1t2t3t4,all_fx):return all_vt1t2t3t4[np.array(all_fx).argmin()]def metropolis(fx,new_fx,t):if new_fx<=fx:return Trueelse:p=math.exp((fx-new_fx)/t)return True if random.random()<p else Falsedef tuihuo(t0, t_final, alpha, inner_iter,start_list,end_list):#t0為初始溫度,t_final為終止溫度,alpha為冷卻系數,inner_iter為內層迭代次數,[start,end]為定義域all_vt1t2t3t4=[]all_fx=[]v,T1,T2,T3,T4=initialication_tuple(start_list,end_list)all_vt1t2t3t4.append((v,T1,T2,T3,T4))all_fx.append(f(v,T1,T2,T3,T4))t=t0while t>t_final:v,T1,T2,T3,T4=search(all_vt1t2t3t4,all_fx)fx=f(v,T1,T2,T3,T4)for i in range(inner_iter):new_vt1t2t3t4=geerate_new_tuple([v,T1,T2,T3,T4],start_list,end_list)new_fx=f(new_vt1t2t3t4[0],new_vt1t2t3t4[1],new_vt1t2t3t4[2],new_vt1t2t3t4[3],new_vt1t2t3t4[4])if metropolis(fx,new_fx,t):v,T1,T2,T3,T4=tuple(new_vt1t2t3t4)fx=new_fxall_vt1t2t3t4.append((v,T1,T2,T3,T4))all_fx.append(f(v,T1,T2,T3,T4))t=alpha*tprint(fx*0.5)return search(all_vt1t2t3t4,all_fx),all_fxdef f_show(v,T1,T2,T3,T4):t_list=np.linspace(0,400,801).tolist()u_list=[25]for i in t_list:kk=k(i,v)*(T(i,v,T1,T2,T3,T4)-u_list[-1])u_list.append(u_list[-1]+kk*0.5)u_list.pop()list_217=[i for i in u_list if i>217]max_position=np.array(list_217).argmax()list_217=list_217[:max_position]plt.plot(t_list,u_list)plt.axhline(y=217,ls='--',color='g')plt.plot([i[0] for i in zip(t_list,u_list) if i[1]>217][:max_position],list_217)plt.show()if __name__=='__main__':all=tuihuo(3000,10,0.95,20,[65,165,185,225,245],[100,185,205,245,265])print(all[0])print(f(all[0][0],all[0][1],all[0][2],all[0][3],all[0][4])/2)f_show(all[0][0],all[0][1],all[0][2],all[0][3],all[0][4])plt.plot(all[1])plt.show()
最小面積 436.88723462346024
溫區 | 1-5 | 6 | 7 | 8-9 |
溫度 | 184.99999999300636 | 204.99999746941685 | 232.35526429807527 | 264.99884587932297 |
總結
以上是生活随笔為你收集整理的2020A炉温曲线第三题模拟退火算法(附代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于32单片机两轮平衡小车控制系统设计
- 下一篇: PLL与DLL锁相环介绍