2020A炉温曲线第三题模拟退火算法(附python代码)

编程入门 行业动态 更新时间:2024-10-24 06:30:21

2020A<a href=https://www.elefans.com/category/jswz/34/1759618.html style=炉温曲线第三题模拟退火算法(附python代码)"/>

2020A炉温曲线第三题模拟退火算法(附python代码)

在问题二的条件下求出面积的最小值

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炉温曲线第三题模拟退火算法(附python代码)

本文发布于:2024-02-17 14:57:16,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1694431.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:炉温   算法   曲线   代码   python

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!