metropolis准则(模拟退火算法–python实现)

metropolis准则
模拟退火算法是一种近似求解最优化问题的方法,其可以跳出局部最优解,寻找到全局最优解。本篇主要介绍它的python实现及使用。
1、模拟退火算法简介原理:模拟退火算法包含两个部分即Metropolis准则和退火过程,分别对应内循环和外循环。外循环就是退火过程,将固体达到较高的温度(初始温度T(0)),然后按照降温系数alpha使温度按照一定的比例下降,当达到终止温度Tf时,冷却结束,即退火过程结束。
Metropolis算法是内循环,即在每次温度下,迭代L次,寻找在该温度下能量的最小值(即最优解)。Metropolis算法就是如何在局部最优解的情况下让其跳出来,是退火的基础。
Metropolis准则:1953年Metropolis提出重要性采样方法,即以概率来接受新状态,而不是使用完全确定的规则,称为Metropolis准则,计算量较低。
假设前一个状态为x(n),系统根据某一指标(梯度下降,上节的能量),状态变为x(n+1),相应的,系统的能量由E(n)变为E(n+1),定义系统由x(n)变为x(n+1)的接受概率P为:

如果能量减小了,那么这种转移就被接受(概率为1),如果能量增大了,就说明系统偏离全局最优值位置更远了,此时算法不会立刻将其抛弃,而是进行概率操作:首先在区间【0,1】产生一个均匀分布的随机数,如果P,则此种转移接受,否则拒绝转移,进入下一步,往复循环。其中P以能量的变化量和T进行决定概率P的大小,接受概率是动态的。
流程:
注:以上来自他人博客,关于模拟退火算法原理和介绍可直接在网上搜索
2、python实现:根据模拟退火算法的原理和流程,用python语言编写:

程序包含四部分:第一部分导入程序运行的相关模块。
第二部分是程序核心部分,其中又分为”__init__”(初始化)、”generate_new”(产生新值)、”Metrospolis”(判断准则)、”find_best”(找到最值)、”display”(画图)和”run”(运行程序)。
第三部分是定义求解函数。
第四部分是设置模拟退火算法参数,运行程序
3、程序使用需要自己修改的地方是第三和第四部分,第三部分编写目标函数,”x”类型为列表,存储自变量;第四部分”sa”内参数分别代表:func自定义函数、自变量个数、自变量约束条件、T_max退火初始温度、T_min退火结束温度、alpha降温系数、in_iter内循环迭代次数。
自变量约束条件,按照对应输入自变量的顺序输入约束条件,例如:x=[x1, x2, x3], x1范围为[1,2], x2范围为[0, 1], x3范围为[2, 5],则输入时自变量约束条件部分为”1, 2, 0, 1, 2, 5″(英文符号),如果无约束,则可以不写,对于自变量一些有约束、其他一些无约束,有约束的按照有约束的写,无约束的写入任意两个相同的值即可。
程序求得到最小值、如果求最大值,将第三部分”return f”改为”return -f”。
4、例子求一元函数x在[-5, 5]最大值:
函数图像:

程序求解:

求二元函数:

后台回复“008”获取源代码
扫码关注

metropolis准则相关文章

版权声明