模拟退火算法介绍及matlab实现
模拟退火算法介绍及matlab实现
参数
- 待求解参数维度:D
- x i L x_{\text{i}}^L xiL, x i U x_{\text{i}}^U xiU:待求解参数的上下限
- L:每一温度下的迭代次数
- α \alpha α:温度递增系数 T ( k + 1 ) = α ⋅ T ( k ) T(k+1)=\alpha\cdot T(k) T(k+1)=α⋅T(k)
- T0:初始温度
- Error_Thre:代价函数阈值(代价函数小于(大于)该值时,停止迭代)
- K:Metropolis准则系数
算法流程
参数初始化
x i ( 0 ) = x i L + r a n d ( 0 , 1 ) ⋅ ( x i U − x i L ) x_{\text{i}}(0)=x_{\text{i}}^L+rand(0,1)\cdot(x_{\text{i}}^U-x_{\text{i}}^L) xi(0)=xiL+rand(0,1)⋅(xiU−xiL)搜索(现有解随机增减)
{ Y = { y 1 , y 2 , ⋯ , y D } ; z i = y i y 1 2 + y 2 2 + ⋯ + y D 2 ; X ( K + 1 ) = X ( K ) + T ( K + 1 ) ⋅ Z \left\{ \begin{array}{l} Y = \{y_1,y_2,\cdots,y_D\};\\ z_\text{i}=\displaystyle\frac{y_\text{i}}{\sqrt{y_1^2+y_2^2+\cdots+y_\text{D}^2}};\\ X(K+1)=X(K)+T(K+1)\cdot Z \end{array} \right. ⎩⎪⎨⎪⎧Y={y1,y2,⋯,yD};zi=y12+y22+⋯+yD2 yi;X(K+1)=X(K)+T(K+1)⋅Z判断优劣判断当前解与现存最优解
- ⟹ \Longrightarrow ⟹当前解更好,当前解替代现存最优解;
- ⟹ \Longrightarrow ⟹当前解不好,按照Metropolis准则迭代替换;
- Metropolis: P = e − Δ C K T \displaystyle P=\displaystyle e^{-\frac{\Delta C}{KT}} P=e−KTΔC Δ C \Delta C ΔC为当前解和上一次解目标函数的差值
- 按照P所示的概率来决定当前解是否保留
- 保留:上一次解替换为当前解
- 不保留:上一次解保留
判断迭代条件是否完成
温度是否足够低 or 目标函数最后小(大);
流程总结
6.示例代码
clear
close all
clcD = 10;
X_Min = -20;
X_Max = 20;
L = 500; % 每一个温度下的迭代次数
alpha = 0.998; % T_Next = T_Current*h
S0 = 10; % 变异算子
T0 = 10000; % 初始温度
T = T0;
error_Thre = 1e-8; % 代价函数阈值
T_Thre = 0.001;
K = 0.6; % Metropolis准则系数% 迭代次数初始化
iter = 1;
iter_Max = log(T_Thre/T0)/log(alpha);
% iter_Max = T0/T_Thre;% 参数初始化
Current_X = rand(1, D) .* (X_Max - X_Min) + X_Min;
Current_X_Fitness = Fitness(Current_X);
Pre_X = Current_X;
Pre_X_Fitness = Current_X_Fitness;
Best_X = Current_X;
MinFitness_List = zeros(1,floor(iter_Max)+100);
MinFitness_List(1) = Fitness(Best_X);
Fitness_List = zeros(1,floor(iter_Max)+100);
Fitness_List(1) = MinFitness_List(1);% 与进度条有关的东西
waitbarinter = iter_Max/100;
tic
h = waitbar(0, ['已完成:0% 运算中...用时:', num2str(toc)]);while (MinFitness_List(iter) > error_Thre) && (T > T_Thre)iter = iter+1;% 1.简易模拟退火T = alpha * T;% % 2. 经典模拟退火% T = T0/log10(iter);% % 3. 快速模拟退火% T = T0/(iter);% 在当前温度T下的迭代% 当前温度下最优解的初始化Fitness_temp = 0;X_temp = zeros(1,D);for i = 1:L% 随机生成新的解N_temp = randn(1,D);P_temp = N_temp/sqrt(sum(N_temp.^2));Current_X = Pre_X + T*P_temp;% 边界限制 防止解过大或过小Current_X = BoundaryLimit(Current_X, X_Min, X_Max);Current_X_Fitness = Fitness(Current_X);% 更新当前温度下的最优解if i == 1Fitness_temp = Current_X_Fitness;X_temp = Current_X;elseif Current_X_Fitness < Fitness_tempFitness_temp = Current_X_Fitness;X_temp = Current_X;endend% 判断当前解与最优解以及上一解的大小关系if Pre_X_Fitness <= Current_X_Fitness% 当前解不如上一次解 Metropolis准则,减小局部最优解的可能P = exp(-1 * (Current_X_Fitness - Pre_X_Fitness) / K / T);if P > randPre_X = Current_X;Pre_X_Fitness = Current_X_Fitness;end% 当前解比上一次解好elsePre_X = Current_X;Pre_X_Fitness = Current_X_Fitness;endend% 更新全局最优解if MinFitness_List(iter-1) > Fitness_tempMinFitness_List(iter) = Fitness_temp;Best_X = X_temp;elseMinFitness_List(iter) = MinFitness_List(iter-1);end% 将每个温度下的最优解都存储起来Fitness_List(iter) = Fitness_temp;% 进度条if mod(iter, waitbarinter) <1waitbar(iter / iter_Max, h, ['已完成:' num2str(iter / iter_Max * 100) ...'% 运算中...用时:', num2str(toc),'/',num2str(toc/iter * iter_Max)])end
end
close(h)% 结果文字展示
display(['The best solution obtained by SA is : ', num2str(Best_X)]);
display(['The best optimal value of the objective funciton found by SA is : ', num2str(MinFitness_List(iter))]);% 结果图像展示
figure
semilogy(MinFitness_List(1:iter),'linewidth',1.2)
hold on
semilogy(Fitness_List(1:iter),'linewidth',1.2)
legend(['最小适应度变化'],['适应度变化'])
title('Convergence Curve')
xlabel('Iteration');
ylabel('Best score obtained so far');
axis tight
grid on
box on% 目标函数
function result = Fitness(x)result = sum(x.^2);
end% 边界限制函数
function result = BoundaryLimit(X, Min, Max)for i_temp = 1:length(X)if X(i_temp) > MaxX(i_temp) = Max;endif X(i_temp) < MinX(i_temp) = Min;endendresult = X;
end
模拟退火算法介绍及matlab实现相关推荐
- 模拟退火算法介绍、分析与应用
文章目录 模拟退火算法介绍.分析与应用 模拟退火原理 固体退火 模拟退火 通俗理解 解释 符号说明 算法思想 Metropolis SAA机制与原理 伪代码 算法组成与分析 优点 缺点 改进方案 解决 ...
- matlab 思维进化算法,差分进化算法介绍及matlab实现
引言 差分进化算法是基于群体智能理论的优化算法,是通过群体内个体间的合作与竞争而产生的智能优化搜索算法,它保留了基于种群的全局搜索策略,采用实数编码.基于差分的简单变异操作和"一对一&quo ...
- 模拟退火算法团簇matlab,基于模拟退火优化算法的二元团簇结构优化方法与流程...
本发明涉及一种基于模拟退火优化算法的二元团簇结构优化方法. 背景技术: 在催化.光学.电学等诸多领域,二元合金团簇在基础科学与应用方面吸引了广泛的研究热情.而这些性质与二元团簇的几何结构有着密切的联系 ...
- 频谱细化-----CZT算法介绍及MATLAB实现
CZT变换 采用FFT算法可以很快算出全部N点DFT值,即Z变换X(z)X\left( z \right)X(z)在Z平面单位圆上的全部等间隔取样值.实际中,也许不需要计算整个单位圆上Z变换的取样,如 ...
- 频谱细化-----Zoom-FFT算法介绍及MATLAB实现
栅栏效应 若长度为 N = T / d t = T ⋅ f s N=T/dt=T\cdot {{f}_{s}} N=T/dt=T⋅fs,其中 T T T为采样时间, d t dt dt为采样间隔, ...
- 模拟退火算法团簇matlab,基于改进Basin-Hopping Monte Carlo算法的Fen-Ptm(5≤n+m≤24)合金团簇结构优化...
摘要: 合金纳米团簇可以充分利用多种金属的协同效应来实现材料的多功能特性,因而备受关注.本文利用改进的Basin-Hopping Monte Carlo算法研究了不同尺寸和不同比例下的Fe-Pt二元合 ...
- 频谱细化matlab程序,频谱细化-----Zoom-FFT算法介绍及MATLAB实现
x ( n ) = x 0 ( n ) e ? j 2 π n f e / f s = x 0 ( n ) cos ? ( 2 π n f e / f s ) ? j x 0 ( n ) sin ? ...
- [算法学习]模拟退火算法(SA)、遗传算法(GA)、布谷鸟算法(CS)、人工蜂群算法(ABC)学习笔记---附MATLAB注释代码
目录 1.模拟退火算法(Simulated Annealing,SA) 1.1 本质: 1.2 算法思想 1.3 SA流程图 1.4 模拟退火过程 1.5 SA解决TSP问题 1.6 SA改进方向 1 ...
- 【VRP问题】基于matlab模拟退火算法求解带容量的VRP问题(多车型)
一.简介 模拟退火算法介绍\ \ \ \ \ 3 模拟退火算法的参数\ 模拟退火是一种优化算法,它本身是不能独立存在的,需要有一个应用场合,其中温度就是模拟退火需要优化的参数,如果它应用到了聚类分析中 ...
最新文章
- 【机器学习】扎实入门机器学习的路子
- nacos 读取纯数字字符 出错 @value
- python定时任务_Python定时任务(上)
- 使用ActionTrail Python SDK
- HBase 手动 flush 机制梳理
- C#多线程编程系列(四)- 使用线程池
- 华为P50系列即将登场:曝线下门店已开始准备样机、物料
- [jboss] 运行多个JBoss实例
- ASP.NET2.0中的App_Data文件的作用
- java验证ie版本的正则表达式_JS 浏览器类型判断,IE版本类型判断,正则表达式判断。...
- 消防信号总线原理_消防设施操作员关键技能之八:能通过总线式消防联动控制器启动警报等装置...
- 10. Have assignment operators return a reference to *this
- Hessian Matrix(海森矩阵)
- appscan如何扫描移动应用APP
- formidable词根词缀_SAT词根词缀汇总内容(6)
- 计算机毕业设计ssm小区宠物管理系统k8n96系统+程序+源码+lw+远程部署
- 信息检索导论要点整理
- Premature end of Content-Length delimited message body解决方案
- 第十三周 项目3车辆类(继承)
- 飞塔防火墙VOIP ALG参数导致SIP外呼无声音的坑
热门文章
- 【线性系统】六、能控性和能观性
- OCI、CRI、CNI、CSI规范在kubernetes项目体系里的关系
- 使用python处理眼动数据
- 6-Python数字和列表
- 011 Verilog原语
- OS_process_sync_producercomsumer进程同步/互斥/信号量管程:临界资源/临界区:生产者和消费者问题(缓冲池(缓冲区)问题)
- MATLAB练习题(数学实验作业)
- 云南计算机专升本数据结构_云南省普高专升本专业课《数据结构》考试大纲
- 利用micro:bit开发板工具写一个小游戏
- U3d—通过CRL下载文件并保存本地___#三分有点码#专栏