首页 > 其他分享 >随机化与SA学习笔记

随机化与SA学习笔记

时间:2022-08-25 11:58:01浏览次数:73  
标签:int double energy 笔记 随机化 模拟退火 SA

SA

今天翻出了很久之前给自己安排做的题

P4035 [JSOI2008]球形空间产生器

结果我把高斯消元忘了,想起之前拿随机化贪心骗分的快乐,于是学习了另一种解法A掉这道题。

看标签都知道,模拟退火

我打的第一个模拟退火没用随机化,珂以算作爬山。

首先,我们为了尽可能的得到最快最优的答案。先把初始状态设为每一维度的平均值。

以二维圆形为例子(样例):

woxihuan heyifei

我们找到当前状态与每个点的距离平均值。若小于这个平均值则往远离该点的方向移动,反之靠近该点。

具体移动多少,枚举每一维,然后把该维答案与该点的差乘以平均值与距离之差与平均值的比值。

这部分的代码是:

for(int i=1;i<=n+1;i++)
   for(int j=1;j<=n;j++)
    cha.x[j]+=((dis[i]-ave))*(a[i].x[j]-ans.x[j])/ave;

cha就是每一维的改变值

最后根据模拟退火的温度变化,把温度设为一个系数,乘以差值在加上当前状态,累加后的当前状态经过降温后又将重复操作,直到温度达到最低温度。

这是累加代码

for(int i=1;i<=n;i++)ans.x[i]+=cha.x[i]*t;

这是模拟退火的关键(温度变化):

for(double t=10000;t>0.0001;t*=0.99996)sa(t);

最后,我们用玄学做法AC了这道省选紫题。

下面我们再看一道SA的模板题 P1337 [JSOI2004] 平衡点 / 吊打XXX

前置知识:力的合成与分解。

若不知道力的合成与分解,计算合力可用一下代码。

double energy(double x,double y){
    double ans=0;
    for(int i=1;i<=n;i++)ans+=dist(x,y,a[i].x,a[i].y)*a[i].w;
    return ans;
}

意思就是把这个点拨到x,y位置,若增加一个外力卡住正好可以平衡,这个外力就珂以用这个函数计算。

我们的目的就是找到一个值使得这个合力尽可能小。有两种办法。

第一个是两次三分法找到二元单峰函数的最小值,这里不再展开介绍。

第二种就是模拟退火。

其实还有计算几何的做法我不会(doge)。

我们在目前的x,y上各增加一个随机值,然后对比energy的大小比较。

如果小于energy或者差值可以被接受,则把答案设为随机增加后的新答案。

同时降温,使得x,y的变化趋势减弱。

这里给出核心代码

double sa(){
    for(double t=1145;t>eps;t*=0.999){
        double tx=ansx+(rand()*2-fi)*t,ty=ansy+(rand()*2-fi)*t;
        double del=energy(tx,ty)-energy(ansx,ansy);
        if(del<0)ansx=tx,ansy=ty;
        else if(exp(-del/t)*fi>rand())ansx=tx,ansy=ty;
    }
}

随机化

P2210 Haywire,这题珂以算是随机化的模板题

每个牛有三个朋友,可以随机排列牛。( N≤12N≤12 )

你是不是想全排列爆搜?

然鹅 12!≈4\times10^812!≈4×108 时间是不优秀的。

于是我们可以随机化贪心。

随机构造一个奶牛的顺序,然后模拟铁路的长度即可,因为是来回的,所以答案要除以2。

这时候一次贪心的代码:

void solve(){
    random_shuffle(p+1,p+n+1);
    for(int i=1;i<=n;i++)id[p[i]]=i;
    int res=0;
    for(int i=1;i<=n;i++){
        int now=id[f[i].zj],a=id[f[i].a],b=id[f[i].b],c=id[f[i].c];
        res+=abs(now-a)+abs(now-b)+abs(now-c);
    } 
    ans=min(ans,res);
}

我粗略试了一下,随机化 10^6106 次即可AC,远远优于 4\times10^84×108

在结尾,我送上一道好题

完结撒花

 

标签:int,double,energy,笔记,随机化,模拟退火,SA
From: https://www.cnblogs.com/masida-hall-LZ/p/16623817.html

相关文章

  • 数论笔记(1)
    1、模运算的性质:加法:\[(A+B)\,mod\,C=(A\,mod\,C+B\,mod\,C)\,mod\,C\]乘法:\[(A\timesB)\,mod\,C=[(A\,mod\,C)\times(B\,mod\,C)]\,mod\,C\]减法:\[(A-B)......
  • MyBatis学习笔记03
    MyBatis单表操作mapper.xml修改完成CRUD的操作<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN"......
  • Sass预处理器 常见函数的基本使用
    Sass提供了许多内置模块,其中包含有用的函数(以及mixin)。这些模块可以像任何用户定义的样式表一样使用@use规则加载,它们的函数可以像任何其他模块成员一样调用。所有内置模块......
  • 可信计算学习笔记 - 服务器可信支撑平台【GB/T 36639-2018】
    服务器可信支撑平台主要由物理可信根、可信基础组件和虚拟可信组件等部分组成根据服务器软硬件组成的不同,服务器可信支撑平台包含的部分也不同服务器硬件系统:应包......
  • P6143 [USACO20FEB]Equilateral Triangles P & ZLOJ 练习70 C
    writtenon2022-08-22有关曼哈顿距离的题目,同时涉及斜对角线前缀和。此题要求寻找曼哈顿距离意义下的等边三角形,那么涉及曼哈顿距离,我们可以想到,到一个点曼哈顿距离相......
  • MyBatis学习笔记02
    1.环境搭建1.1数据初始化//创建库CREATEDATABASEtj_mybatis_learning;//创建表CREATETABLEtbl_department(idvarchar(32)NOTNULL,deptNamevarchar(3......
  • MyBastis学习笔记01
    1.MyBatis概述MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBati......
  • Dubbo/Zookeeper笔记
    分布式基础:Doubbo/Zookeeper分布式理论一、什么是分布式系统?分布式系统是若干个独立计算机的集合,这些计算机对于用户来说就像单个相关系统分布式系统是一组通过......
  • 2022-08-24 第五组 赖哲栋 学习笔记
    JavaScriptJavaScript脚本语言,解释型,主要用来给HTML网页增加动态功能通常的js是运行在浏览器环境下的JS的两种模型DOM:文档对象模型documentBOM:浏览器对象模型wind......
  • Java学习笔记5
    抽象类抽象类和其中抽象方法由abstract修饰,继承抽象类的所有方法必须由子类实现。Java的类是单继承,但是可以继承多个接口抽象类不能new实例化接口普通类:只有具体实......