首页 > 编程语言 >优化算法——模拟退火算法

优化算法——模拟退火算法

时间:2023-06-14 21:00:55浏览次数:48  
标签:double 算法 模拟退火 static 优化 public Math


模拟退火算法原理

爬山法是一种贪婪的方法,对于一个优化问题,其大致图像(图像地址)如下图所示:

优化算法——模拟退火算法_Math


其目标是要找到函数的最大值,若初始化时,初始点的位置在优化算法——模拟退火算法_模拟退火算法_02处,则会寻找到附近的局部最大值优化算法——模拟退火算法_最优解_03点处,由于优化算法——模拟退火算法_最优解_03点出是一个局部最大值点,故对于爬山法来讲,该算法无法跳出局部最大值点。若初始点选择在优化算法——模拟退火算法_模拟退火算法_05处,根据爬山法,则会找到全部最大值点优化算法——模拟退火算法_Math_06。这一点也说明了这样基于贪婪的爬山法是否能够取得全局最优解与初始值的选取由很大的关系。

模拟退火算法(Simulated Annealing, SA)的思想借鉴于固体的退火原理,当固体的温度很高的时候,内能比较大,固体的内部粒子处于快速无序运动,当温度慢慢降低的过程中,固体的内能减小,粒子的慢慢趋于有序,最终,当固体处于常温时,内能达到最小,此时,粒子最为稳定。模拟退火算法便是基于这样的原理设计而成。

模拟退火算法从某一较高的温度出发,这个温度称为初始温度,伴随着温度参数的不断下降,算法中的解趋于稳定,但是,可能这样的稳定解是一个局部最优解,此时,模拟退火算法中会以一定的概率跳出这样的局部最优解,以寻找目标函数的全局最优解。如上图中所示,若此时寻找到了优化算法——模拟退火算法_最优解_03点处的解,模拟退火算法会以一定的概率跳出这个解,如跳到了优化算法——模拟退火算法_模拟退火算法_05点重新寻找,这样在一定程度上增加了寻找到全局最优解的可能性。

模拟退火算法

模拟退火算法过程

(1)随机挑选一个单元优化算法——模拟退火算法_模拟退火算法_09,并给它一个随机的位移,求出系统因此而产生的能量变化优化算法——模拟退火算法_优化算法_10
(2)若优化算法——模拟退火算法_优化算法_11,该位移可采纳,而变化后的系统状态可作为下次变化的起点;
优化算法——模拟退火算法_模拟退火算法_12,位移后的状态可采纳的概率为
优化算法——模拟退火算法_模拟退火算法_13
式中优化算法——模拟退火算法_最优解_14为温度,然后从优化算法——模拟退火算法_最优解_15区间均匀分布的随机数中挑选一个数优化算法——模拟退火算法_优化算法_16,若优化算法——模拟退火算法_最优解_17,则将变化后的状态作为下次的起点;否则,将变化前的状态作为下次的起点。
(3)转第(1)步继续执行,知道达到平衡状态为止。

模拟退火算法流程

优化算法——模拟退火算法_模拟退火算法_18

模拟退火算法的Java实现

求解函数最小值问题:
优化算法——模拟退火算法_Math_19
其中,优化算法——模拟退火算法_最优解_20,输入任意优化算法——模拟退火算法_最优解_21值,求优化算法——模拟退火算法_优化算法_22的最小值。

##Java代码

package sa;

/**
 * 实现模拟退火算法
 * @author zzy
 *Email:[email protected]
 */
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



标签:double,算法,模拟退火,static,优化,public,Math
From: https://blog.51cto.com/u_16161414/6481122

相关文章

  • 挑战数据结构和算法面试题——最大间隔
    分析:本题首先需要理解清楚最大间隔的最小:最初的间隔为:[1,1,4,1],此时最大间隔为4删除2后的间隔为:[2,4,1],此时最大间隔为4删除3后的间隔为:[1,5,1],此时最大间隔为5删除7后的间隔为:[1,1,5],此时最大间隔为5在删除元素后的间隔为:[4,5,5],最小值为:4方法:intget_min_max_margin(int*a,constintn){......
  • 挑战数据结构和算法——栈的push、pop序列
    题目来源“数据结构与算法面试题80道”。在此给出我的解法,如你有更好的解法,欢迎留言。问题分析:本题考查栈的基本操作,栈是一种“先进后出”的数据结构。判断一个序列是否是栈的pop序列是一种常见的问题,可以通过模拟push和pop的过程,push和pop总是成对出现的,如:方法:#definepush1#def......
  • 【数据结构和算法面试题】跳台阶问题
    题目来源“数据结构与算法面试题80道”。问题分析:假设为跳台阶的总跳法,当时,;当时,;当时,如果先跳1级台阶,有种方法,如果先跳2级台阶,有种方法,依次类推,可以得到下面的递推公式:方法:intget_kind(intn){ if(n<=0)return0; intresult; int*cal=(int*)malloc(sizeof(int)*n);......
  • 挑战数据结构和算法——整数的二进制表示中1的个数
    题目来源“数据结构与算法面试题80道”。在此给出我的解法,如你有更好的解法,欢迎留言。问题分析:本题涉及到二进制的处理,在本题使用到&操作和>>操作。方法:intget_num(intn){intnum=0;if(n<0){num+=1;n=n*(-1);}while(n!=0){......
  • 推荐系统中的常用算法——Wide & Deep
    1.概述在前DeepLearning时代,以LogisticRegression(LR)为代表的广义线性模型在CTR,CVR中得到了广泛的应用,主要原因包括:模型足够简单,相当于不包括隐含层的神经网络;可扩展性强;可解释性强,因为是线性的模型,可以很方便的显现出特征对最终结果的强弱。虽然线性模型有如上的优点,但同时也存在......
  • 【数据结构与算法面试题】二叉树节点的最大距离
    题目来源“数据结构与算法面试题80道”。问题分析:涉及的知识点是二叉树的遍历,遍历的方法主要有:先序遍历中序遍历后序遍历层次遍历在本题中,使用先序遍历的方法。方法:voidm_length(BSTreeNode*root,int*length,int*max_length){if(NULL==root||(NULL==root......
  • 机器学习算法实现解析——libFM之libFM的训练过程之Adaptive Regularization
    本节主要介绍的是libFM源码分析的第五部分之二——libFM的训练过程之AdaptiveRegularization的方法。5.3、AdaptiveRegularization的训练方法5.3.1、SGD的优劣在“机器学习算法实现解析——libFM之libFM的训练过程之SGD的方法”中已经介绍了基于SGD的FM模型的训练方法,SGD的方法的......
  • 推荐算法——非负矩阵分解(NMF)
    1.矩阵分解回顾在博文推荐算法——基于矩阵分解的推荐算法中,提到了将用户-商品矩阵进行分解,从而实现对未打分项进行打分。矩阵分解是指将一个矩阵分解成两个或者多个矩阵的乘积。对于上述的用户-商品矩阵(评分矩阵),记为,可以将其分解成两个或者多个矩阵的乘积,假设分解成两个矩阵和,......
  • 机器学习中的常见问题——K-Means算法与矩阵分解的等价
    一、K-Means算法的基本原理K-Means算法是较为经典的聚类算法,假设训练数据集XX为:{x1,x2,⋯,xn}{x1,x2,⋯,xn},其中,每一个样本xjxj为m......
  • 优化算法——坐标上升法
    一、坐标上升法算法原理坐标上升法(CoordinateAscent)每次通过更新函数中的一维,通过多次的迭代以达到优化函数的目的。假设需要求解的优化问题的具体形式如下:其中,是向量的函数。更新过程为每次固定除以外的参数,求得满足条件的,直到算法收敛,具体的算法过程如下所示:(图片来自参考文......