预备概念:

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

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

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

参考洛谷日报上某巨佬代码(主要是参考在何时接受次优解,生成正负随机数的技巧以及如何确定退火初值),打了一下洛咕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. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_02 泛型_5_定义和使用含有泛型的接口

    定义泛型接口 Scanner的接口 接口的实现类.实现这个接口,规定数据类型为String类型 ArrayList是List接口的实现类 再看下List接口的源码 泛型实现类也定义为泛型 重写泛型的方 ...

  2. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_1_Map集合概述

    map集合是双列集合 map有两个泛型.左边K也叫作键 右边V是value

  3. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_4_字节输出流写入数据到文件

    数据由内存写入到硬盘中 构造函数传的路径是一个相对路径.有异常需要捕获异常 释放资源 这三个方法,都有异常 IO异常是父类,所以这里只需要抛出IO异常就可以了. 运行程序.目录内多了个a.txt文件 ...

  4. tensorflow 关于 矩阵 运算 + 符号得含义。 2维 数组 + 1纬数组, 就是每一行都 加一边 1纬数组。 呵呵

    小锋子Shawn(403568338)  13:51:23mnist.training.images?墨须(964489899)  13:51:27我的图片是100*100的,该怎么兼容.  小锋子S ...

  5. 类ThreadGroup

    Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制. 默认的情况下,所有的线程都属于主线程组. public final Thread ...

  6. Charls

    1.连接设备 charles--proxy--proxy setting 设置端口号 charles--proxy--ssl proxy setting 设置代理域名 [pc端] charles--p ...

  7. 嗯,python

    总觉得在这么个地方已经没有在碰blog的可能了...但是... 突然说要用python来配置环境...好歹也是这个专业的啊...还是 看看吧... 然后 百度一搜,看到一个 好的 网站,不知道 我一旦 ...

  8. js提交图片转换为base64

    $("#picAjax").change(function () { var strs = ""; var file = $("#picAjax&qu ...

  9. <每日一题> Day8:CodeForces-996A.Hit the Lottery(贪心)

    原题链接 因为数据太水,我直接一发暴力过了...... #include <cstdio> using namespace std; ] = {, , , , }; int main() ...

  10. SpringMVC处理器拦截器 Interceptor

    拦截器概念 Java 里的拦截器是动态拦截action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种 ...