预备概念:

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

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

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

参考洛谷日报上某巨佬代码(主要是参考在何时接受次优解,生成正负随机数的技巧以及如何确定退火初值),打了一下洛咕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. shell脚本一一项目6

    主题:获取网卡的流量 ifconfig 查看流量 文件流量数据量 脚本内容 #!/bin/bash#name: mark# check network dev's liuliangnic=$1 ech ...

  2. 07 oracle 归档模式 inactive/current redo log损坏修复--以及错误ORA-00600: internal error code, arguments: [2663], [0], [9710724], [0], [9711142], [], [], [], [], [], [], []

    07 oracle 归档模式 inactive/current redo log损坏修复--以及错误ORA-00600: internal error code, arguments: [2663], ...

  3. 【SD系列】SAP SD模块-公司间销售简介

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SD系列]SAP SD模块-公司间销售简介   ...

  4. 应用安全 - 代码审计 - Python

    flask客户端session导致敏感信息泄露 flask验证码绕过漏洞 CodeIgniter 2.1.4 session伪造及对象注入漏洞 沙箱逃逸

  5. python+selenium下拉列表option对象操作方法二

    options = driver.find_elements_by_tag_name('option')                               #获取所有的option子元素 o ...

  6. [19/05/17-星期五] HTML_body标签(内嵌标签)和框架标签

    一.内嵌标签 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!- ...

  7. (一) MySQL架构

    1.MySQL架构 MySQL拥有分层的架构,上层是服务器层的服务和查询执行引擎,下层是存储引擎,真正负责数据的存储和提取. 服务层包含了连接和线程处理,以及大多数MySQL的核心服务,如对SQL的解 ...

  8. ECharts-第一篇最简单的应用

    1.简单演示一个饼状图 准备好echarts-all.js 2.编写页面代码 <!DOCTYPE html> <html> <head> <meta char ...

  9. Python学习第四十一天函数装饰器传参数的用法

    在不改变函数的结构的基础,我们给函数加新的功能,用是函数装饰器,如果要给函数传递参数,那么应该怎么做呢 @timerdef test2(name,age): time.sleep(3) print(' ...

  10. Feign负载均衡

    Feign是一个声明式的Web Service客户端,比Ribbon好用,默认也是轮巡.我们只需要使用Feign创建一个接口,并用注解就好了.如果你基于spring cloud发布一个接口,实际上就是 ...