[HDU1109]模拟退火算法
模拟退火的基本思想:
(1) 初始化:初始温度T(充分大),初始解状态S(是算法迭代的起点),每个T值的迭代次数L
(2) 对k=1,……,L做第(3)至第6步:
(3) 产生新解$S\prime $
(4) 计算增量$\Delta t\prime = C\left( {S\prime } \right) - C\left( S \right)$,其中$C\left( S \right)$为评价函数
(5) 若$\Delta t\prime < 0$则接受$S\prime $作为新的当前解,否则以概率$exp\left( { - \Delta t\prime /T} \right)$接受$S\prime $作为新的当前解.
(6) 如果满足终止条件则输出当前解作为最优解,结束程序。 终止条件通常取为连续若干个新解都没有被接受时终止算法。
(7) T逐渐减少,且T->0,然后转第2步。
从算法的流程上看,模拟退火算法包括三函数、两准则,即状态产生函数、状态接受函数、温度更新函数、内循环终止准则和外循环终止准则,这些环节的设计将决定模拟退火算法的优化性能。此外,初温的选择对模拟退火算法性能也有很大的影响。
状态产生函数:
原则:设计状态产生函数(领域函数)的出发点应该是尽可能保证产生的候选解遍布全部的解空间。通常,状态产生函数由两部分组成,即产生候选解的方式和候选解吃剩的概率分布。
方法:在当前状态下的领域结构内以一定的概率方式(均匀分布、正态分布、指数分布等)产生
状态接受函数:
原则:函数一般以概率的方式给出,不同接受函数的差别主要在于接受概率的形式不同。设计状态接受概率,应该遵循以下原则:
1)在固定温度下,接受使目标函数下降的候选解的概率要大于使目标函数上升的候选解的概率;
2)随温度的下降,接受目标函数上升的解的概率要逐渐减少;
3)当温度趋于零时,只能接受目标函数下降的解。方法:状态接受函数的引入是模拟退火算法实现全局搜索的最关键的因素,模拟退火算法中通常用作为状态接受函数。
初始温度、温度更新函数、内循环终止准则和外循环终止准则通常被称为退火历程。
初始温度:
原则:通过理论分析可以得到初温的解析式,但解决实际问题难以得到精确的参数;实际应用往往要让初温充分大。实验表明:初温越大,获得高质量解的机率越大,但花费较多的计算时间。
方法:
(1)均匀抽样一组状态,以各状态目标值的方差为初温;
(2)随机产生一组状态,确定两两状态间的最大目标差值,根据差值,利用一定的函数确定初温,譬如 ,其中为初始接受函数;
(3)利用经验公式。
温度更新函数:
温度更新函数,即温度下降方式,用于在啊外循环中修改温度值。
内循环终止准则:
常用的Metropolis抽样准则:
1)检验目标函数的均值是否稳定;
2)连续若干步的目标值变化较小;
3)按一定步数抽样。
外循环终止准则:
1)设置终止温度的阈值;
2)设置外循环迭代次数;
3)算法搜索到的最优值连续若干步保持不变;
4)概率分析方法。
\[p(dE) = exp(dE/kT)\]其中k是一个常数,exp表示自然指数,且dE<0。这条公式说白了就是:温度越高,出现一次能量差为dE的降温的概率就越大;温度越低,则出现降温的概率就越小。又由于dE总是小于0(否则就不叫退火了),因此dE/kT < 0 ,所以P(dE)的函数取值范围是(0,1) 。
若ΔT<0则接受S′作为新的当前解S,否则以概率exp(-ΔT/T)接受S′作为新的当前解S。
http://acm.hdu.edu.cn/showproblem.php?pid=1109
题意:给定X,Y,M,求区域内点到已知点最短距离的最大值。
解题关键:
1、注意一定不要忘记设立初始解。
2、T_min、T_max转化为步长,以保证精确度。
3、内循环、外循环一定要理解。
4、此程序其实还有一个问题未解决,即以一定的概率接受非最优解,而由于未找到良好的评估函数,故可以直接用时间之比即可,若有时候WA时,尝试一下下面第二个程序。
5、在这里其实就是将外循环的降温当做误差范围。
6、第一个程序相当于多点爬山?不算随机算法。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<iostream>
using namespace std;
typedef long long ll;
#define INF 100000000
#define N 30
#define PI acos(-1.0)
double X,Y,M;
double step,eps=1e-,k=0.55;//step代表最长的跨度 ,注意这种用法 ,用来控制精度
struct point{
double x,y;
}people[],num[];
double d[]; double dist(point a,point b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} bool judge(point a){
return a.x>=&&a.x<=X&&a.y>=&&a.y<=Y;
} double rand1(double l,double r){//随机数生成函数
return rand()%/10000.0*(r-l)+l;
} double fun(point a){
double td=INF;
for(int i=;i<M;i++){
td=min(td,dist(num[i],a));
}
return td;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
double max1=-1.0;
int maxn=;
cin>>X>>Y>>M;
for(int i=;i<M;i++){
scanf("%lf%lf",&num[i].x,&num[i].y);
} for(int i=;i<N;i++){
people[i].x=rand1(,(double)X);
people[i].y=rand1(,(double)Y);
d[i]=fun(people[i]);
} step=max(X,Y);
while(step>eps){
for(int i=;i<N;i++){//初始状态一般为30个
for(int j=;j<;j++){//一般循环50次左右,看题目要求的时间可以变化
point tem;
double angle=rand1(,*PI);//枚举任何角度,使得到的新点向四周扩散
tem.x=people[i].x+cos(angle)*step;
tem.y=people[i].y+sin(angle)*step;
if(!judge(tem)) continue;
double dd=fun(tem);
if(dd>d[i]){ //这里一定要注意,必须要更新,不要忘记
d[i]=dd;
people[i]=tem;
}
}
}
step*=k;
}
for(int i=;i<N;i++){//找到退火后的状态中,最优的解
if((d[i]-max1)>eps){
maxn=i;
max1=d[i];
}
}
printf("The safest point is (%.1f, %.1f).\n",people[maxn].x,people[maxn].y);
}
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 100000000
#define EPS 1e-6
#define N 30
#define PI acos(-1.0)
double X,Y,M;
double step,eps=1e-,k=0.55;//step代表最长的跨度 ,注意这种用法 ,用来控制精度
struct point{
double x,y;
}people[],num[];
double d[]; double dist(point a,point b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} bool judge(point a){
return a.x>=&&a.x<=X&&a.y>=&&a.y<=Y;
} double rand1(double l,double r){//随机数生成函数
return rand()%/10000.0*(r-l)+l;
} double fun(point a){
double td=INF;
for(int i=;i<M;i++){
td=min(td,dist(num[i],a));
}
return td;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
double max1=-1.0;
int maxn=;
cin>>X>>Y>>M;
for(int i=;i<M;i++){
scanf("%lf%lf",&num[i].x,&num[i].y);
} for(int i=;i<N;i++){
people[i].x=rand1(,(double)X);
people[i].y=rand1(,(double)Y);
d[i]=fun(people[i]);
} step=max(X,Y);
while(step>eps){
for(int i=;i<N;i++){//初始状态一般为30个
for(int j=;j<;j++){//一般循环50次左右,看题目要求的时间可以变化
point tem;
double angle=rand1(,*PI);//枚举任何角度,使得到的新点向四周扩散
tem.x=people[i].x+cos(angle)*step;
tem.y=people[i].y+sin(angle)*step;
if(!judge(tem)) continue;
double dd=fun(tem);
if(dd>d[i]){ //这里一定要注意,必须要更新,不要忘记
d[i]=dd;
people[i]=tem;
}
else{
if(rand()%/10000.0>exp(k-)){
d[i]=dd;
people[i]=tem;
}
}
}
}
step*=k;
}
for(int i=;i<N;i++){//找到退火后的状态中,最优的解
if((d[i]-max1)>EPS){
maxn=i;
max1=d[i];
}
}
printf("The safest point is (%.1f, %.1f).\n",people[maxn].x,people[maxn].y);
}
}
[HDU1109]模拟退火算法的更多相关文章
- 初探 模拟退火算法 POJ2420 HDU1109
模拟退火算法来源于固体退火原理,更多的化学物理公式等等这里不再废话,我们直接这么来看 模拟退火算法简而言之就是一种暴力搜索算法,用来在一定概率下查找全局最优解 找的过程和固体退火原理有所联系,一般来讲 ...
- 模拟退火算法-[HDU1109]
模拟退火算法的原理模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到 ...
- 【高级算法】模拟退火算法解决3SAT问题(C++实现)
转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46453761 ---------------------------------- ...
- 模拟退火算法(SA)求解TSP 问题(C语言实现)
这篇文章是之前写的智能算法(遗传算法(GA).粒子群算法(PSO))的补充.其实代码我老早之前就写完了,今天恰好重新翻到了,就拿出来给大家分享一下,也当是回顾与总结了. 首先介绍一下模拟退火算法(SA ...
- 原创:工作指派问题解决方案---模拟退火算法C实现
本文忽略了对于模拟退火的算法的理论讲解,读者可参考相关的博文或者其他相关资料,本文着重于算法的实现: /************************************************ ...
- BZOJ 3680: 吊打XXX【模拟退火算法裸题学习,爬山算法学习】
3680: 吊打XXX Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 3192 Solved: 1198[Sub ...
- OI骗分神器——模拟退火算法
前言&&为什么要学模拟退火 最近一下子学了一大堆省选算法,所以搞一个愉快一点的东西来让娱乐一下 其实是为了骗到更多的分,然后证明自己的RP. 说实话模拟退火是一个集物理与IT多方面知识 ...
- 模拟退火算法 R语言
0 引言 模拟退火算法是用来解决TSP问题被提出的,用于组合优化. 1 原理 一种通用的概率算法,用来在一个打的搜索空间内寻找命题的最优解.它的原理就是通过迭代更新当前值来得到最优解.模拟退火通常使用 ...
- 模拟退火算法(西安网选赛hdu5017)
Ellipsoid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
随机推荐
- 2018年长沙理工大学第十三届程序设计竞赛 E 小木乃伊到我家 【最短路】
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 AA的欧尼酱qwb是个考古学家,有一天qwb发 ...
- python cookbook 迭代器与生成器
代理迭代 a = [1, 2, 3] for i in iter(a): print(i) for i in a.__iter__(): print(i) 这里的两个方法是一样的,调用iter()其实 ...
- my.cnf重要配置参数说明
不同存储引擎中关键参数优化 MyISAM存储引擎 MyISAM存储引擎适用于读多写少,对读性能要求比较高的系统 官方文档:http://dev.mysql.com/doc/refman/5.6/en/ ...
- hiho一下 第四十八周 拓扑排序·二【拓扑排序的应用 + 静态数组 + 拓扑排序算法的时间优化】
题目1 : 拓扑排序·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论,当 ...
- tp导出excel
//数据导出 protected function dao($db,$where,$join,$field){ $data = M($db)->join($join)->where($wh ...
- LINQ 学习路程 -- 查询操作 ElementAt, ElementAtOrDefault
Element Operators (Methods) Description ElementAt 返回指定索引的元素,如果索引超过集合长度,则抛出异常 ElementAtOrDefault 返回指定 ...
- 针对PHP性能方面编程技巧的总结
注:本文为作者多年工作经验总结,转贴请注明出处 Albert Wang 做PHP已经有4年多了吧,总是没写点什么总结一下,现在开始写博客了,也顺便总结下吧,留给那些新入行的朋友看看. 1. 不宜频繁使 ...
- github与eclipse结合使用
github是现在流行的代码托管平台,今天以eclipse为例讲解github的使用,新建项目,提交eclipse项目到github,新建分支,合并分支 1.github上新建项目 记下githug项 ...
- HTML-CSS浮动元素详解
浮动定位是指 1.1将元素排除在普通流之外,即元素将脱离标准文档流 1.2元素将不在页面占用空间 1.3将浮动元素放置在包含框的左边或者右边 1.4浮动元素依旧位于包含框之内 2. 浮动的框可以向左或 ...
- Tomcat_总结_02_单机多实例
一.tomcat下载及环境变量配置 1.tomcat下载 下载地址:tomcat官网 2.环境变量配置 只用配置一个CATALINA_HOME就可以了 二.CATALINA_HOME 与 CATALI ...