模拟退火算法

本文介绍了模拟退火算法的原理和模型,这是一种源于固体退火原理的元启发式算法。通过逐步降温并根据Metropolis准则接受或拒绝新解,模拟退火算法能解决一些单调函数问题。文中给出了两个使用模拟退火算法解决POJ题目(2420和2069)的C++代码示例。
摘要由CSDN通过智能技术生成

模拟退火算法介绍

1.1 模拟退火算法的原理

模拟退火算法是一种元启发式(Meta-Heuristics)算法,来源于固体退火原理,将固体加热至充分高的温度,再让其徐徐冷却。加热时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。根据Metropolis准则,粒子在温度T时趋于平衡的概率为 ,其中E为温度T时的内能,ΔE为其改变量,kBoltzmann常数。

1.2 模拟退火算法的模型

① 初始化:初始温度T(充分大),初始解状态S(算法迭代的起点), 每次迭代次数L

② for k=1 to L 做③至⑥

③ 产生新解S’

④ 计算增量Δt′=C(S′)-C(S),其中C(S)为评价函数

⑤ 若Δt′<0则接受S’作为新的当前解,否则以概率 接受S’作为新的当前解

⑥ 如果满足终止条件则输出当前解作为最优解,结束程序

⑦ T逐渐减少,然后转②

 

图片

又是一种神奇的算法:模拟退火。就是一步步地退火,一步步地逼进。这种算法应该是只能用于一些单调函数性质的几何问题、现实问题吧。模拟退火与以往所学的算法大不相同,在某种程度上来说是一种万能算法。如果有什么图论、几何之类的题如果做不出,应该可以用模拟退火来试试人品。

POJ 2420 照着网上一个小代码轻松敲定。人品不错,一次AC。

Source Code

Problem: 2420   User: liu696639
Memory: 352K   Time: 0MS
Language: C++   Result: Accepted
    • Source Code
      #include<iostream>
      #include<cmath>
      #include<stdio.h>
      using namespace std
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值