模拟退火学习

模拟退火学习

作业部落
网上讲的不错的(他好像还有一些其他的东西、、、)

引入

对于一些题目,无法直接算出答案或者想不到正解,想到随机找答案,那么模拟退火就是一种有系统方法的随机算法

没用的不需要了解的来源

百度百科......
模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。

几个要记下来的东西

  1. 温度:大概理解为答案的波动范围,看是否会接受不那么好的解
  2. 爬山算法:找很多个答案起点,遇到峰值就记录答案,最后找最大(小)答案

用途

  1. 数据范围不大但爆搜显然过不了的题目
  2. 有一定的求解规律但又不完全符合规律的题目
  3. 多峰函数题或者算数几何之类的题目
  4. 题目想不出,退火总比爆0好的题目

主要思想

  • 把当前答案看成一只退火兔,一开始很急躁(温度很高),所以答案到处乱跑(这中间会记录最优解),最后兔子慢慢冷静下来(温度逐渐降低),就找到答案
  • 利用rand来寻找答案接受劣解的波动范围(当然T也是一个决定性参数)
  • 退火找答案之后,可能会有更优答案在自己周围很近的地方,所以rand去周围看一看是否更优
  • 一开始根据自己的猜测来找一个答案“开始”点,可以降低一定时间复杂度......

板子

我只讲大致的思想,具体实现根据模板题及luogu的题解讲述来学习吧
主要是懒

first

luogu板子题平衡点/吊打xxx
然后,我的优美代码......

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<ctime>
#include<queue>
#include<stack>
#include<vector>
#define rg register
#define il inline
#define lst long long
#define ldb long double
#define cold 0.99
#define N 1050
#define RD T*((rand()<<1)-RAND_MAX)//rand一个-T到T的数,随机跳多远
#define Time() (ldb)clock()/(ldb)CLOCKS_PER_SEC
using namespace std;
const int Inf=1e9;int n;
ldb ansx,ansy,ans;
ldb etlx,etly,etl;
struct WEI{ldb x,y,m;
}ljl[N];il int read()
{rg int s=0,m=0;rg char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')m=1;ch=getchar();}while(ch>='0'&&ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();return m?-s:s;
}il ldb f(rg ldb xx,rg ldb yy)
{rg ldb res=0;for(rg int i=1;i<=n;++i){rg ldb dx=xx-ljl[i].x,dy=yy-ljl[i].y;res+=sqrt(dx*dx+dy*dy)*ljl[i].m;}return res;
}int main()
{srand(time(NULL));n=read();for(rg int i=1;i<=n;++i){scanf("%Lf%Lf%Lf",&ljl[i].x,&ljl[i].y,&ljl[i].m);ansx+=ljl[i].x,ansy+=ljl[i].y;}etlx=ansx=ansx/n,etly=ansy=ansy/n;etl=ans=f(ansx,ansy);while(Time()<0.3){rg ldb nans=etl,nx=etlx,ny=etly;for(rg ldb T=1000;T>=1e-16;T*=cold){rg ldb xx=nx+RD,yy=ny+RD;//模拟退火答案的波动范围rg ldb res=f(xx,yy);//找答案的ansif(ans>res)ans=res,ansx=xx,ansy=yy;//更新答案if(nans>res||exp((res-nans)/T)*RAND_MAX<rand())nans=res,nx=xx,ny=yy;}}printf("%.3Lf %.3Lf\n",ansx,ansy);return 0;
}

second

有难度,luogu均分数据

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<ctime>
#include<queue>
#include<stack>
#include<vector>
#define rg register
#define il inline
#define lst long long
#define ldb long double
#define N 25
#define M 10
#define Time() (ldb)clock()/(ldb)CLOCKS_PER_SEC
using namespace std;
const int Inf=1e5;int n,m;
ldb tot,ans=Inf;
ldb v[N],sum[N];
ldb dp[N][N];il int read()
{rg int s=0,m=0;rg char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')m=1;ch=getchar();}while(ch>='0'&&ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();return m?-s:s;
}il ldb PF(rg ldb x){return x*x;}
il ldb sol()
{for(rg int i=1;i<=n;++i)sum[i]=sum[i-1]+v[i];for(rg int i=0;i<=n;++i)for(rg int j=0;j<=m;++j)dp[i][j]=Inf;dp[0][0]=0;for(rg int i=1;i<=n;++i)for(rg int j=1;j<=m;++j)for(rg int k=0;k<i;++k)dp[i][j]=min(dp[i][j],dp[k][j-1]+PF(sum[i]-sum[k]-tot));ans=min(ans,dp[n][m]);return dp[n][m];
}il void SA(rg ldb T)
{rg ldb nans=ans;for(;T>1e-3;T*=0.98){rg int xx=1+rand()%n,yy=1+rand()%n;if(xx==yy)continue;swap(v[xx],v[yy]);rg ldb res=sol();if(res<nans||exp((res-nans)/T)*rand()-RAND_MAX<0)nans=res;else swap(v[xx],v[yy]);}
}int main()
{n=read(),m=read();for(rg int i=1;i<=n;++i)v[i]=read(),tot+=v[i];tot/=m,sol();while(Time()<0.3)SA(1000);printf("%.2Lf\n",sqrt(ans/m));return 0;
}

转载于:https://www.cnblogs.com/cjoierljl/p/9394519.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spotify 数据分析_我的Spotify流历史分析

spotify 数据分析Spotisis /spo-ti-sis/ noun The analysis of one’s Spotify streaming history using Python.Spotisis / spo-ti-sis / 名词使用Python分析一个人的Spotify流历史。 I was reading through a lot of data science related guides and project ideas when I …

idea 搜索不到gsonformat_Idea中GsonFormat插件安装

这个教不的期是范添事大部会基近说小间进围砖本的程主要是学习IntelliJ IDEA 如何通过GsonFormat插件将JSONObject格式的String 支器事的后功发久这含层请间业在屏有随些气和域&#xff0c;实按控幻近持的前时来能过后些的处求也务浏蔽等机站风滚或默现钮制灯近持的前时来能过后…

intellig idea中jsp或html数据没有自动保存和更换字体

主题一:保存数据jsp intellig idea是自动保存数据的,看到没有保存 解决方案&#xff1a; 成功解决 主题二:更换字体: 或者快捷键CtelAlts 成功解决 转载于:https://www.cnblogs.com/weibanggang/p/9398498.html

java 环境变量

1.确保安装jrd jdk 2.环境变量配置 (1)新建->变量名"JAVA_HOME"&#xff0c;变量值"C:\Java\jdk1.8.0_05"&#xff08;JDK的安装路径&#xff09; (2)编辑->变量名"Path"&#xff0c;在原变量值的最后面加上“;%JAVA_HOME%\bin;%JAVA_HOME…

陆涛喜欢夏琳吗_夏琳·香布利斯(Charlene Chambliss):从心理学到自然语言处理和应用研究

陆涛喜欢夏琳吗技术系列中的女性 (WOMEN IN TECHNOLOGY SERIES) Interest in data science has been exponentially increasing over the past decade, and more and more people are working towards making a career switch into the field. In 2020, articles and YouTube v…

【angularJS】简介

简介 AngularJS 是一个 JavaScript 框架。它可通过 <script> 标签添加到 HTML 页面。 AngularJS 通过 指令 扩展了 HTML&#xff0c;且通过 表达式 绑定数据到 HTML。 AngularJS 是一个 JavaScript 框架。它是一个以 JavaScript 编写的库。 AngularJS 是以一个 JavaScrip…

爬取淘宝商品信息selenium+pyquery+mongodb

爬取淘宝商品信息,通过selenium获得渲染后的源码,pyquery解析,mongodb存储 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import Timeout…

纹个鸡儿天才小熊猫_给熊猫用户的5个提示

纹个鸡儿天才小熊猫A popular Python library used by those working with data is pandas, an easy and flexible data manipulation and analysis library. There are a myriad of awesome methods and functions in pandas, some of which are probably less well-known tha…

本人服务器遭受黑客长期攻击,特把这几天做的一些有用的安全方面总结出来,以方便以后查阅

消息队列iis360northrarsql2000 netscren本人服务器遭受黑客长期攻击&#xff0c;特把这几天做的一些有用的安全方面总结出来&#xff0c;以方便以后查阅&#xff0c;希望这次彻底解觉黑客的攻击&#xff0c;特次谢谢“冷雨夜”的一些提示。 windows 2003服务器安全设置方法 0…

用户与用户组管理

linux最优秀的地方之一&#xff0c;就在于他的多用用户、多任务环境。 用户及用户组的概念 1、文件所有者 由于linux是一个多用户、多任务的系统。因此可能常常会有很多人同时使用这台主机来进行工作的情况发生&#xff0c;为了考虑每个人的隐私权以及每个人的喜好的工作环境&a…

代码 抠图_3 行 Python 代码 5 秒抠图的 AI 神器,根本无需 PS,附教程

曾几何时&#xff0c;「抠图」是一个难度系数想当高的活儿&#xff0c;但今天要介绍的这款神工具&#xff0c;只要 3 行代码 5 秒钟就可以完成高精度抠图&#xff0c;甚至都不用会代码&#xff0c;点两下鼠标就完成了。感受下这款抠图工具抠地有多精细&#xff1a;是不是很赞&a…

python函数使用易错举例

关于嵌套&#xff1a; 嵌套使用中&#xff0c; retrun inner ---> 返回的是函数的地址 retrun inner() &#xff1a; ---> 运行inner()函数 ---> 运行inner()函数后的返回值a&#xff08;假设&#xff09;返回上级 --> retrun inner()得到返回值a 如…

图像离群值_什么是离群值?

图像离群值你是&#xff01; (You are!) Actually not. This is not a text about you.其实并不是。 这不是关于您的文字。 But, as Gladwell puts it in Outliers, if you find yourself being that type of outlier, you’re quite lucky. And rare.但是&#xff0c;正如Gla…

混合模型和EM---混合高斯

2019独角兽企业重金招聘Python工程师标准>>> 混合高斯 最大似然 用于高斯混合模型的EM 转载于:https://my.oschina.net/liyangke/blog/2986520

永恒python地速_立竿见影地把你的 Python 代码提速7倍

之前曾经测试计算斐波那契数列的几种方法&#xff0c;其中基于递归的方法是速度最慢的&#xff0c;例如计算第 40 项的值&#xff0c;需要 36 秒。如下图所示。要提高运算速度&#xff0c;根本办法当然是改进算法。不过算法的提高是一个长期积累加上灵机一动的过程。我们今天要…

顶尖大学实验室的科研方法_这是来自顶尖大学的5门免费自然语言处理课程

顶尖大学实验室的科研方法Data Science continues to be a hot topic, but more specifically, Natural Language Processing (NLP) is increasing in demand.数据科学仍然是一个热门话题&#xff0c;但更具体地说&#xff0c;自然语言处理(NLP)的需求正在增长。 Broadly spea…

Python学习---django知识补充之CBV

Django知识补充之CBV Django: url --> def函数 FBV[function based view] 用函数和URL进行匹配 url --> 类 CBV[function based view] 用类和URL进行匹配 POSTMAN插件 http://blog.csdn.net/zzy1078689276/article/details/77528249 基于CBV的登…

「CH2101」可达性统计 解题报告

CH2101 可达性统计 描述 给定一张N个点M条边的有向无环图&#xff0c;分别统计从每个点出发能够到达的点的数量。N,M≤30000。 输入格式 第一行两个整数N,M&#xff0c;接下来M行每行两个整数x,y&#xff0c;表示从x到y的一条有向边。 输出格式 共N行&#xff0c;表示每个点能够…

蓝图解锁怎么用_[UE4蓝图][Materials]虚幻4中可互动的雪地材质完整实现(一)

不说废话&#xff0c;先上个演示图最终成果&#xff08;脚印&#xff0c;雪地可慢慢恢复&#xff0c;地形可控制&#xff09;主要原理&#xff08;白话文&#xff09;&#xff1a;假如你头上是块白色并且可以透视的平地&#xff0c;来了个非洲兄弟踩上面&#xff0c;你拿起单反…

数据预处理工具_数据预处理

数据预处理工具As the title states this is the last project from Udacity Nanodegree. The goal of this project is to analyze demographics data for customers of a mail-order sales company in Germany.如标题所示&#xff0c;这是Udacity Nanodegree的最后一个项目。…