预备概念:

  金属退火:将金属缓慢加热到一定温度,保持足够时间,然后以适宜速度冷却

  温度:一个逐渐减小的参数,表示接受次优解的概率

模拟退火是一种解决复杂问题的算法,相当于贪心,但以一个逐渐减小的该率接受次优解,当然,该次优解距最优解越远,同等温度下被接受的概率也就越小

参考洛谷日报上某巨佬代码(主要是参考在何时接受次优解,生成正负随机数的技巧以及如何确定退火初值),打了一下洛咕P1337

接受次优解:

  exp (  ( ans            -         cur  )    /   temp)   *        RAND_MAX             >      rand()

       当前最优解              当前解    温度             定值,参考cstdlib                 随机数

调参失败时具体技巧:

  1:开始的随机种子一定要多随机几次(玄学???)

  2:调节温度下降的速度(至少0.99以上QWQ)

  3:合理调整最终答案的处值,模拟退火算法可以多执行几次,判定算法结束的条件精度高

  4:用一些玄学数字:19******

#include<cstdio>
#include<cstdlib>
#include<cmath>
#define ll long long
#define ri register int const int MAXN = ;
const int SA_TIME = ;
const double DELTA = 1e-; ll read(){
ll x = ; int zf = ; char ch = ' ';
while (ch != '-' && (ch < '' || ch > '')) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (ch >= '' && ch <= '') x = x * + ch - '', ch = getchar(); return x * zf;
} int x[MAXN], y[MAXN], w[MAXN];
int n; double ansx = , ansy = , ans=1e18;
const double delta = 0.993; inline double getDis(double x1, double y1, double x2, double y2){
return (sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)));
} inline double cacEny(double curx,double cury){
double sum = ;
for (ri i = ; i <= n; ++i)
sum += getDis(x[i], y[i], curx, cury) * w[i];
return sum;
} inline int getRand(){
//需要返回负数,故特殊处理rand函数
return ((rand() << ) - RAND_MAX);
} inline void SA(){
double sx = ansx, sy = ansy, curx, cury;
double temp = ;
while (temp >= DELTA){
if (temp < )
temp = temp - + ;
curx = sx + getRand() * temp, cury = sy + getRand() * temp;
double cur_eny = cacEny(curx, cury);
if (cur_eny < ans){
sx = curx, sy = cury;
ansx = curx, ansy = cury, ans = cur_eny;
}//接受次优解
else {
if (exp((ans - cur_eny) / temp) * RAND_MAX > rand())
sx = curx, sy = cury;
}
temp *= delta;
}
} inline void Solve() {
int sumx = , sumy = ;
for (ri i = ; i <= n; ++i)
sumx += x[i], sumy += y[i];
ansx=(double)(sumx) / n, ansy=(double)(sumy) / n;
for (ri i = ; i <= SA_TIME; ++i)
SA();
} int main() {
srand(); srand(rand()); srand(rand()); srand(rand());
n = read();
for (ri i = ; i <= n; ++i)
x[i] = read(), y[i] = read(), w[i] = read();
Solve();
printf("%.3f %.3f\n", ansx, ansy);
return ;
}

未经博主允许禁止转载

参考资料:
  洛谷日报2018年9月#60 地址 作者:M_sea

  exp函数 地址 作者:百度百科

[JSOI2004]平衡点 / 吊打XXX 题解的更多相关文章

  1. BZOJ3680 & 洛谷1337:[JSOI2004]平衡点/吊打XXX——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3680 https://www.luogu.org/problemnew/show/P1337 有n ...

  2. 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 解题报告

    P1337 [JSOI2004]平衡点 / 吊打XXX 题目描述 有 \(n\) 个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.\(X\)处就是公共的绳结.假设 ...

  3. 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX

    洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 点击进入FakeHu的模拟退火博客 神仙模拟退火...去看fakehu的博客吧...懒得写了... 因为精度问题要在求得的最优解附近(大约 ...

  4. luogu1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)

    推荐博客:模拟退火总结(模拟退火)by FlashHu.模拟退火的原理,差不多就是不断地由现有的值不断地试探,不断地转到更优的值,并在一定概率下转到较差的值. 题目传送门:luogu1337 [JSO ...

  5. 题解:[JSOI2004]平衡点 / 吊打XXX

    这个题目算是一个模拟退火的板子题 物重一定,绳子越短,重物越低,势能越小,势能又与物重成正比 使得$\sum_{i=1}^nd[i]*w[i]$也就是总的重力势能最小,可以使得系统平衡 交了两面半.. ...

  6. 题解 P1337 【[JSOI2004]平衡点 / 吊打XXX】

    这道题调了好久,果然非洲人是得不到眷顾的吗... 本题采用模拟退火解决. 模拟退火是一种简洁明了而又高效的近似算法,基本上可以套到任何求最优解的题目上去. 它的原理是模拟物理中金属退火的现象,凭借选手 ...

  7. [luogu1337][bzoj3680][JSOI2004]平衡点 / 吊打XXX【模拟退火】

    题目描述 gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将n个gty吊在n根绳子上,每根绳子穿过天台的一个洞.这n根绳子有 ...

  8. LG1337 [JSOI2004]平衡点 / 吊打XXX

    题意 题目描述 如图:有n个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.图中X处就是公共的绳结.假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不 ...

  9. LG1337 [JSOI2004]平衡点 / 吊打XXX 模拟退火

    问题描述 LG1337 题解 模拟退火模板 记住概率公式: \(exp(\frac{dealt}{T}) \times rand \ge R_A^ND^M_AX\) zzk太欧了,我交了一版没过他来了 ...

随机推荐

  1. log4j.rootLogger作用域

    log4j.rootLogger只对没有申明appender的包起作用:

  2. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_06 Set集合_7_可变参数

    打印出来是一个数组的地址 打印数组的长度 只要调用了add方法就会创建一各长度为0的数组 传一个10过去.就输出了数组的长度为1 传两个数字 注意事项: 特殊写法

  3. CentOS 6 安装Syslog-ng

    entOS 6 安装 Syslog-ng 一. yum 安装 syslog-ng3.7.1 是专门用于RHEL/CentOS version 6 ,不要安装成其他版本.亲身经历,安装成syslog-n ...

  4. oracle--groupby分组学习

    使用group by分组 在多行函数中不能直接使用普通字段,除非group by 在多行函数中不能直接使用单行函数,除非group by group by学习: ---1.使用group by进行数据 ...

  5. web 前端1 html5基础

    HTML web sockent 实例 import socket def handle_request(client): buf = client.recv(1024) client.sendall ...

  6. [Python3] 005 列表的基本使用

    目录 1. 列表概述 2. 创建列表 3. 列表常用操作 (1) 访问列表 (2) 分片操作 1) 正向操作 2) 反向操作 3) 内置函数 id() 加入队伍 1. 列表概述 一组有顺序的数据的组合 ...

  7. ubuntu系统下navicat 试用到期解决方案

    作者:python技术人 博客:https://www.cnblogs.com/lpdeboke 1.直接删除 /home目录下的 .navicat文件夹(此文件夹隐藏),如果你是64位,文件夹名称可 ...

  8. SCUT - 271 - CC 非诚勿扰 - FFT

    https://scut.online/p/271 第一次遇到没这么裸的,其实感觉到是卷积但是不知道怎么化.看来以后要多注意下标. #include <bits/stdc++.h> usi ...

  9. Python内建函数reduce()用法

    reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,下面讲述Python内建函数reduce()用法. ...

  10. FFmpeg从入门到出家(HEVC在RTMP中的扩展)

    由金山云视频云技术团队提供:FFmpeg从入门到出家第三季: 为推进HEVC视频编码格式在直播方案中的落地,经过CDN联盟讨论,并和主流云服务厂商达成一致,规范了HEVC在RTMP/FLV中的扩展,具 ...