• 看似不错的
    了解作者
  • matlab
    开发工具
  • 1KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 0
    下载次数
  • 2019-11-22 17:34
    上传日期
实现退火算法,优化函数的最小值。里面的测试函数很好用 ,借鉴性强
my_SA_exmp.rar
  • my_SA_exmp.m
    2.2KB
内容介绍
% 使用模拟退火法求函数 f(x,y)=x^2+y^2的最小值 % 使用METROPOLIS接受准则进行模拟 %% 清空环境 tic % 计时 clear clc close all format compact % %% 绘制目标函数图像 % x=-5:0.1:5; % y=-5:0.1:5; % [X,Y]=meshgrid(x,y); % value=X.*X+Y.*Y; % figure('Name','目标函数图像') % mesh(X,Y,value) %% SA算法主程序 lb=[-5,-5]; % 参数取值下界 ub=[5,5]; % 参数取值上界 % 冷却表参数 MarkovLength=1000; % 马可夫链长度 DecayScale=0.95; % 衰减参数 StepFactor=0.02; % Metropolis步长因子 Temperature0=100; % 初始温度 Temperatureend=1; % 最终温度 Boltzmann_con=1; % Boltzmann常数 AcceptPoints=0.0; % Metropolis过程中总接受点 % 随机初始化参数 range=ub-lb; Par_cur=rand(size(lb)).*range+lb; % 用Par_cur表示当前解 Par_best_cur=Par_cur; % 用Par_best_cur表示当前最优解 Par_best=rand(size(lb)).*range+lb; % 用Par_best表示冷却中的最好解 % 每迭代一次退火(降温)一次,直到满足迭代条件为止 t=Temperature0; itr_num=0; % 记录迭代次数 while t>Temperatureend itr_num=itr_num+1; t=DecayScale*t; % 温度更新(降温) for i=1:MarkovLength % 在此当前参数点附近随机选下一点 p=0; while p==0 Par_new=Par_cur+StepFactor.*range.*(rand(size(lb))-0.5); % 防止越界 if sum(Par_new>ub)+sum(Par_new<lb)==0 p=1; end end % 检验当前解是否为全局最优解 if (ObjectFunction(Par_best)>ObjectFunction(Par_new)) % 保留上一个最优解 Par_best_cur=Par_best; % 此为新的最优解 Par_best=Par_new; end % Metropolis过程 if (ObjectFunction(Par_cur)-ObjectFunction(Par_new)>0) % 接受新解 Par_cur=Par_new; AcceptPoints=AcceptPoints+1; else changer=-1*(ObjectFunction(Par_new)-ObjectFunction(Par_cur))/Boltzmann_con*Temperature0; p1=exp(changer); if p1>rand Par_cur=Par_new; AcceptPoints=AcceptPoints+1; end end end end %% 结果显示 % plot(ObjectFunction(Par_best)) % xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12) disp(['最小值在点:',num2str(Par_best)]); Objval_best= ObjectFunction(Par_best); disp(['最小值为:',num2str(Objval_best)]); %% 显示运行时间 toc
评论
    相关推荐