模拟退火算法

源代码阅读之模拟退火算法(基于蒙特卡洛的模拟退火算法)(对核心代码进行详细注释)

社会主义新天地 提交于 2019-11-26 14:30:20
阅读代码源自: https://www.cnblogs.com/ranjiewen/p/6084052.html 已对核心代码进行详细注释(这段代码真的超级棒,是针对旅行商问题的模拟退火算法(基于蒙特卡洛算法)求解) #include <iostream>//哈密顿路(所有点都走一次) #include <string.h> #include <stdlib.h>//取随机数时用到 #include <algorithm>//包含swap函数 (个人觉得可以去除,然后编一个交换函数,hhh) #include <stdio.h> #include <time.h>//取随机值时需要使用 #include <math.h>//exp()函数 #define N 30 //城市数量 #define T 3000 //初始温度 #define EPS 1e-8 //终止温度 #define DELTA 0.98 //温度衰减率 #define LIMIT 1000 //概率选择上限 #define OLOOP 20 //外循环次数 #define ILOOP 100 //内循环次数 using namespace std; //定义路线结构体 struct Path { int citys[N]; double len; }; //定义城市点坐标 struct Point {

模拟退火算法

╄→尐↘猪︶ㄣ 提交于 2019-11-26 11:01:52
模拟退火(SA) 物理过程由以下三个部分组成 1.加温过程 问题的初始解 2.等温过程 对应算法的Metropolis抽样的过程 3.冷却过程 控制参数的下降 默认的模拟退火是一个求最小值的过程,其中Metropolis准则是SA算法收敛于全局最优解的关键所在,Metropolis准则以一定的概率接受恶化解,这样就使算法跳离局部最优的陷进 1.模拟退火算法求解一元函数最值问题 使用simulannealbnd - Simulated annealing algorithm工具箱 求y=sin(10*pi*x)./x;在[1,2]的最值 下图是用画图法求出最值的 x=1:0.01:2; y=sin(10*pi*x)./x; figure hold on plot(x,y,'linewidth',1.5); ylim([-1.5,1.5]); xlabel('x'); ylabel('y'); title('y=sin(10*\pi*x)/x'); [maxVal,maxIndex]=max(y); plot(x(maxIndex),maxVal,'r*'); text(x(maxIndex),maxVal,{['x:' num2str(x(maxIndex))],['y:' num2str(maxVal)]}); [minVal,minIndex]=min(y); plot(x