二、模拟退火算法
1. 简介
     模拟退火算法的思想借鉴于固体的退火过程,当固体的温度很高时,内能比较大,固体内的粒子处于快速无序运动状态,当温度慢慢降低,固体的内能减小,粒子逐渐趋于有序,最终固体处于常温状态,内能达到最小,此时粒子最为稳定。

白话理解:一开始为算法设定一个较高的值T(模拟温度),算法不稳定,选择当前较差解的概率很大;随着T的减小,算法趋于稳定,选择较差解的概率减小,最后,T降至终止迭代的条件,得到近似最优解。

2.算法思想及步骤

(1)设置算法的参数:初始温度,结束温度,温度衰减系数,每个温度下的扰动次数,初始状态,初始解

(2)对状态产生扰动,计算新状态下的解,比较两个解的大小,判断是否接受新的状态

(3)在此温度下,对步骤(2)按设置的扰动次数重复进行扰动

(4)对温度进行衰减,并在新的温度下重复(2)(3),直到结束温度

(5)输出记录最优状态和最优解,算法结束

其中,P为算法选择较差解的概率;T 为温度的模拟参数;。

当T很大时,,此时算法以较大概率选择非当前最优解;
P的值随着T的减小而减小;
当时,,此时算法几乎只选择最优解,等同于贪心算法。

%VELASCO, Gimel David F.
%2012-58922
%Cmsc 191
%Simulated Annealing
%Final Exam
%for runs=1:3
clear;
tic;%%%%%%%%%%%%%%%%%%%%%%%%%%%INPUT ARGUMENTS%%%%%%%Sir Joel, dito po%%%%%%%%%
CostF = 2; % | 1 - DE JONGS | 2 - AXIS PARALLEL HYPER-ELLIPSOID | 3 - ROTATED HYPER-ELLIPSOID | 4 - RASTRIGINS | ow - ACKLEYS |
nVar = 3; %染色体的等位基因数目,染色体长度
VarSize = zeros(nVar);
VarMin = -5.12; %upper bound of variable value
VarMax = 5.12; %lower bound of variable value
MaxIt = 100000;%最大迭代次数
T0 = 100;%初始温度
Tf = 0.000000000000001;%最终温度
alpha = 0.7;%温度下降率
%nPop = 10000;
nMove = 10000;
mu = 0.1;
%sigma = 0.25;
%%
%初始化
test_func = CostF;  %sets the number of w/c test function to be solved
ub = VarMax;
lb = VarMin;
ulb = ub;        %upper and lower bound
tpl = nVar;      %dimensions
x_sol = 2*ulb*(rand(1,tpl)-0.5);               %initial guess of the solution x
cooling_ratio = alpha;                    %sets the cooling ratio to 0.8  i.e. 0.7 < 0.8 < 0.9
num_neigh = nMove;                      %initializes the size of the random neighbors
cooling_sched = zeros(1);               %pre-allocation for speed
cooling_sched(1) = T0;                 %initializes the cooling schedule T0
iteration_array = zeros(1);
fittest_array = zeros(1);
solution_array = VarSize;%%%%%%%%%%%%%%%%%%%%%%%%%SIMULATED ANNEALING%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sched = 1;                                  %index
while cooling_sched(sched) > Tf     %终止条件T = cooling_sched(sched);               %sets the value of the temperature Tfor j=1:num_neighr  = (cooling_ratio)^sched;             %is used so that the randomness of selecting a neighbor becomes narrowerx_tmp = 2*ulb*r*(rand(1,tpl)-0.5);    %随机选择一个邻居进行比较if OBJFUNC(x_tmp,tpl,test_func) < OBJFUNC(x_sol,tpl,test_func)  %比较找最优的值x_sol = x_tmp;elseif OBJFUNC(x_tmp,tpl,test_func) > OBJFUNC(x_sol,tpl,test_func)  %if not, change the solution if it is luckydelta = OBJFUNC(x_tmp,tpl,test_func) - OBJFUNC(x_sol,tpl,test_func);p = P(delta,T);q = rand(1);if q <= px_sol = x_tmp; endendendfittest_array(sched) = OBJFUNC(x_sol,tpl,test_func);iteration_array(sched) = sched;solution_array(sched,:) = x_sol;cooling_sched(sched+1) = T*(cooling_ratio)^sched;sched = sched+1;if sched > MaxItbreak;end
end
%SOLUTION
if test_func == 1
fprintf('====================DE JONGS FUNCTION=============================\n');
elseif test_func == 2
fprintf('==============AXIS PARALLEL HYPER-ELLIPSOID FUNCTION==============\n');
elseif test_func == 3
fprintf('===============ROTATED HYPER-ELLIPSOID FUNCTION====================\n');
elseif test_func == 4
fprintf('====================RASTRIGINS FUNCTION===========================\n');
else
fprintf('=====================ACKLEYS FUNCTION=============================\n');
end
fprintf('==================SIMULATED ANNEALING=============================\n');
fprintf('With the Objective Function Value of %.16f\nTotal Runtime of %f seconds\nAnd Final Cooling Temperature of %.16f\n',OBJFUNC(x_sol,tpl,test_func),toc,cooling_sched(sched));
fprintf('The Root for Test Function %d is\n',test_func);
disp(x_sol)
fprintf('==================================================================\n');figure
subplot(2,1,1);
plot(iteration_array,fittest_array);
legend('Cost Function Value');
xlabel('Generation');
ylabel('Fitness of fittest Chromosome');solution_array = transpose(solution_array);
subplot(2,1,2);
plot(iteration_array,solution_array);
xlabel('Generation');
ylabel('Solution of fittest Chromosome');
%end

结果:

模拟退火算法求函数极值(含MATLAB代码实现)相关推荐

  1. python求函数极值_python 遗传算法求函数极值的实现代码

    废话不多说,大家直接看代码吧! """遗传算法实现求函数极大值-Zjh""" import numpy as np import rando ...

  2. matlab求函数极值教程,MATLAB程序设计教程(7)—MATLAB解方程与函数极值

    MATLAB程序设计教程(7)--MATLAB解方程与函数极值 第7章MATLAB解方程与函数极值 7.1  线性方程组求解 7.2  非线性方程数值求解 7.3  常微分方程初值问题的数值解法 7. ...

  3. 基于BP神经网络的非线性函数拟合(一维高斯函数)研究-含Matlab代码

    目录 一.引言 二.BP神经网络的结构与原理 2.1 信息前向传播 2.2 误差的反向传播过程 三.基于BP神经网络的非线性函数拟合 3.1 数据生成 3.2 神经网络拟合结果 四.参考文献 五.Ma ...

  4. 基于遗传算法和模拟退火算法改进的混合模拟退火算法(解决求函数极值问题,MATLAB代码已实现)

    基本思想: 混合模拟退火算法时遗传算法和模拟退火算法的结合,在混合模拟退火算法中使用了大量的样本作为问题的可能解决方案而不是将单个样本作为一个问题的可能解决方案.对遗传算法中适应的概念进行相应改进. ...

  5. 【MATLAB教程案例13】基于SA模拟退火优化算法的函数极值计算matlab仿真及其他应用

    FPGA教程目录 MATLAB教程目录 -------------------------------------------------------------------------------- ...

  6. java模拟退火算法求函数_模拟退火算法从原理到实战【基础篇】

    模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小 ...

  7. 爬山算法求解函数极值(matlab实现)

    爬山算法: 爬山算法是一种简单的贪心搜索算法,在算法迭代的过程中,会从当前解的临近空间中随机选取下一个点,如果比当前结果好则会选取这个点作为新的最优解,否则再次进行选取.因为不是遍历得到的最优解,而是 ...

  8. 【MATLAB教程案例11】基于PSO粒子群优化算法的函数极值计算matlab仿真及其他应用

    FPGA教程目录 MATLAB教程目录 -------------------------------------------------------------------------------- ...

  9. 粒子群算法求函数极值

    粒子群算法是群智能算法中的一种,除此之外还有其他的群智能算法,如蚁群算法.猴群算法.鱼群算法等等.本文是关于粒子群算法的.所有的群智能算法都是通过模拟自然界中的生物群体的行为来解决问题的一种思想,同遗 ...

最新文章

  1. 基于监督学习+自监督学习的智能抠图,精确到发丝 | CVPR 2020
  2. zz SOA推荐书籍列表
  3. 添加service到SystemService硬件服务
  4. AndroidStudio3.0无法打开Android Device Monitor的解决办法(An error has occurred on Android Device Monitor)...
  5. LPS在无人机数据处理中的应用
  6. mysql获取后一天_MySQL根据某一Date值获取相关时间(前一天,后一天等)
  7. java开发简介_Java Web开发介绍
  8. 最新大厂面试真题集锦
  9. 第一个脚本-HelloWorld
  10. SpringCloud高频重点面试题,看这一篇就够了。
  11. xwt100编程器使用方法与xtw100没有找到编程器解决办法
  12. 【博弈论】翻硬币游戏8种模型
  13. 戴尔(DELL)成就Vostro15-7580 15.6英寸八代混合独显便携商务笔记本 5699元
  14. python实现广义线性模型_「原理」机器学习算法入门—广义线性模型(线性回归,逻辑回归)...
  15. Windows系统常用设置
  16. 三七皂苷-壳聚糖(PNS-CSB)水凝胶/聚乙烯吡咯烷酮/pH敏感性羧甲基/壳聚糖水凝胶的制备
  17. “《三国演义》人物出场统计“实例讲解
  18. 运维必备——Zabbix监控系统
  19. 为什么将机器学习应用于资产定价?
  20. rails开发利器:视频播放插件plugin(如何开发一个简单的插件)

热门文章

  1. 海外社媒营销揭秘:品牌出海的关键策略与注意事项
  2. Mysql表结构转Postgresql建表语句快速操作
  3. react里面的楼梯效果
  4. swep在C语言中的头文件,C ++ STL中的queue :: swap()
  5. vmware exsi 调整dpi设置
  6. python中的io模块_Python的StringIO模块和cStringIO模块
  7. python golang相互调用_golang和python互相调用
  8. RecyclerView 使用 和简单demo
  9. 数学及其历史读书摘要(201305)
  10. mix2s android p内测,MIX2S之后,小米又一款机型开启Android P内测