优化算法——模拟退火算法
时间:2022-05-04
本文章向大家介绍优化算法——模拟退火算法,主要内容包括模拟退火算法原理、模拟退火算法、模拟退火算法流程、模拟退火算法的Java实现、最后的结果、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
模拟退火算法原理
爬山法是一种贪婪的方法,对于一个优化问题,其大致图像(图像地址)如下图所示:
其目标是要找到函数的最大值,若初始化时,初始点的位置在CC处,则会寻找到附近的局部最大值AA点处,由于AA点出是一个局部最大值点,故对于爬山法来讲,该算法无法跳出局部最大值点。若初始点选择在DD处,根据爬山法,则会找到全部最大值点BB。这一点也说明了这样基于贪婪的爬山法是否能够取得全局最优解与初始值的选取由很大的关系。
模拟退火算法(Simulated Annealing, SA)的思想借鉴于固体的退火原理,当固体的温度很高的时候,内能比较大,固体的内部粒子处于快速无序运动,当温度慢慢降低的过程中,固体的内能减小,粒子的慢慢趋于有序,最终,当固体处于常温时,内能达到最小,此时,粒子最为稳定。模拟退火算法便是基于这样的原理设计而成。
模拟退火算法从某一较高的温度出发,这个温度称为初始温度,伴随着温度参数的不断下降,算法中的解趋于稳定,但是,可能这样的稳定解是一个局部最优解,此时,模拟退火算法中会以一定的概率跳出这样的局部最优解,以寻找目标函数的全局最优解。如上图中所示,若此时寻找到了AA点处的解,模拟退火算法会以一定的概率跳出这个解,如跳到了DD点重新寻找,这样在一定程度上增加了寻找到全局最优解的可能性。
模拟退火算法
模拟退火算法过程
模拟退火算法流程
模拟退火算法的Java实现
Java代码
package sa;
/**
* 实现模拟退火算法
* @author zzy
*Email:zhaozhiyong1989@126.com
*/
public class SATest {
public static final int T = 100;// 初始化温度
public static final double Tmin = 1e-8;// 温度的下界
public static final int k = 100;// 迭代的次数
public static final double delta = 0.98;// 温度的下降率
public static double getX() {
return Math.random() * 100;
}
/**
* 求得函数的值
*
* @param x目标函数中的一个参数
* @param y目标函数中的另一个参数
* @return函数值
*/
public static double getFuncResult(double x, double y) {
double result = 6 * Math.pow(x, 7) + 8 * Math.pow(x, 6) + 7
* Math.pow(x, 3) + 5 * Math.pow(x, 2) - x * y;
return result;
}
/**
* 模拟退火算法的过程
* @param y目标函数中的一个参数
* @return最优解
*/
public static double getSA(double y) {
double result = Double.MAX_VALUE;// 初始化最终的结果
double t = T;
double x[] = new double[k];
// 初始化初始解
for (int i = 0; i < k; i++) {
x[i] = getX();
}
// 迭代的过程
while (t > Tmin) {
for (int i = 0; i < k; i++) {
// 计算此时的函数结果
double funTmp = getFuncResult(x[i], y);
// 在邻域内产生新的解
double x_new = x[i] + (Math.random() * 2 - 1) * t;
// 判断新的x不能超出界
if (x_new >= 0 && x_new <= 100) {
double funTmp_new = getFuncResult(x_new, y);
if (funTmp_new - funTmp < 0) {
// 替换
x[i] = x_new;
} else {
// 以概率替换
double p = 1 / (1 + Math
.exp(-(funTmp_new - funTmp) / T));
if (Math.random() < p) {
x[i] = x_new;
}
}
}
}
t = t * delta;
}
for (int i = 0; i < k; i++) {
result = Math.min(result, getFuncResult(x[i], y));
}
return result;
}
public static void main(String args[]) {
// 设置y的值
int y = 0;
System.out.println("最优解为:" + getSA(y));
}
}
最后的结果
最优解为:1.733360963664572E-16
- 微软 WCF的几种寄宿方式,寄宿IIS、寄宿winform、寄宿控制台、寄宿Windows服务
- 深度学习框架之一:Theano | Lasagne简单教程
- 有趣的应用 | 使用RNN预测股票价格系列一
- 通过深度学习实现安全帽佩戴的检测
- python及numpy,pandas易混淆的点
- 深度学习中的损失函数总结以及Center Loss函数笔记
- TF使用例子-LSTM实现序列标注
- 图像学习-验证码识别
- ResNet原理及其在TF-Slim中的实现
- 理工男的文科梦 —— LSTM深度学习写春联
- keras学习笔记-黑白照片自动着色的神经网络-Alpha版
- keras学习笔记-黑白照片自动着色的神经网络-Beta版
- Python 设计模式初探
- 请注意,我们要谈谈神经网络的注意机制和使用方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 磁盘空间分析神器 - ncdu
- Kafka笔记—可靠性、幂等性和事务
- 工程能力UP!| LightGBM的调参与并行
- 你想要的Android性能优化系列:启动优化 !
- 微信小程序的自定义组件(入门)
- linux 中关于PAM的点滴笔记
- 49. Vue使用axios发送Ajax请求
- UCSC-browser学习:创建自己的track hubs
- 五分钟快速搭建Serverless免费邮件服务
- 基于qiankun落地部署微前端爬”坑“记
- Android推送的群魔乱舞
- 用百度接口实现图片文字识别,并打包成安装包软件
- 视野前端(二)V8引擎是如何工作的
- 【干货】Chrome插件(扩展)开发全攻略
- 超性感的React Hooks(一):为何她独具魅力