这题真的能用模拟退火吗
  • 板块P1433 吃奶酪
  • 楼主Remake_
  • 当前回复4
  • 已保存回复4
  • 发布时间2020/8/9 12:21
  • 上次更新2023/11/6 20:51:41
查看原帖
这题真的能用模拟退火吗
223797
Remake_楼主2020/8/9 12:21

初温设了10000001000000度,t\triangle t设了0.9930.993,结束温度设了101610^{-16},SA跑了12001200次,srand(rand())srand(rand())33次,加了火车头,卡了常,都用上也是8080分。

这题本来是个裸的TSPTSP,模拟退火最早的应用就是在TSPTSP上面的,不懂这题为啥要卡模拟退火(之前也有人反映过)。

附代码:

//#pragma GCC target("sse,sse2,sse3,sse4.1,sse4.2,popcnt,abm,mmx,avx")
//#pragma comment(linker,"/STACK:102400000,102400000")
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("inline")
//#pragma GCC optimize("-fgcse")
//#pragma GCC optimize("-fgcse-lm")
//#pragma GCC optimize("-fipa-sra")
//#pragma GCC optimize("-ftree-pre")
//#pragma GCC optimize("-ftree-vrp")
//#pragma GCC optimize("-fpeephole2")
//#pragma GCC optimize("-ffast-math")
//#pragma GCC optimize("-fsched-spec")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC optimize("-falign-jumps")
//#pragma GCC optimize("-falign-loops")
//#pragma GCC optimize("-falign-labels")
//#pragma GCC optimize("-fdevirtualize")
//#pragma GCC optimize("-fcaller-saves")
//#pragma GCC optimize("-fcrossjumping")
//#pragma GCC optimize("-fthread-jumps")
//#pragma GCC optimize("-funroll-loops")
//#pragma GCC optimize("-fwhole-program")
//#pragma GCC optimize("-freorder-blocks")
//#pragma GCC optimize("-fschedule-insns")
//#pragma GCC optimize("inline-functions")
//#pragma GCC optimize("-ftree-tail-merge")
//#pragma GCC optimize("-fschedule-insns2")
//#pragma GCC optimize("-fstrict-aliasing")
//#pragma GCC optimize("-fstrict-overflow")
//#pragma GCC optimize("-falign-functions")
//#pragma GCC optimize("-fcse-skip-blocks")
//#pragma GCC optimize("-fcse-follow-jumps")
//#pragma GCC optimize("-fsched-interblock")
//#pragma GCC optimize("-fpartial-inlining")
//#pragma GCC optimize("no-stack-protector")
//#pragma GCC optimize("-freorder-functions")
//#pragma GCC optimize("-findirect-inlining")
//#pragma GCC optimize("-frerun-cse-after-loop")
//#pragma GCC optimize("inline-small-functions")
//#pragma GCC optimize("-finline-small-functions")
//#pragma GCC optimize("-ftree-switch-conversion")
//#pragma GCC optimize("-foptimize-sibling-calls")
//#pragma GCC optimize("-fexpensive-optimizations")
//#pragma GCC optimize("-funsafe-loop-optimizations")
//#pragma GCC optimize("inline-functions-called-once")
//#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<bits/stdc++.h>
#define dt 0.992
#define endt 1e-16
using namespace std;
int n;
double x[20],y[20];
double ans=1e11;
vector<int> order;
bool pd(double Delta,double t){
    return exp(-Delta/t)*RAND_MAX>rand();
}
double calc(){
    double anss=sqrt(x[order[0]]*x[order[0]]+y[order[0]]*y[order[0]]);
    for(int i=1;i<order.size();i++) anss+=sqrt((x[order[i]]-x[order[i-1]])*(x[order[i]]-x[order[i-1]])+(y[order[i]]-y[order[i-1]])*(y[order[i]]-y[order[i-1]]));
    return anss;
}
void SA(){
    double t=1000000;
    while(t>=endt){
        int nowx=rand()%n;
        int nowy=rand()%n;
        swap(order[nowx],order[nowy]);
        double nowans=calc();
        double delta=nowans-ans;
        if(delta<0) ans=nowans;
        else if(!pd(delta,t)) swap(order[nowx],order[nowy]);
        t*=dt;
    }
}
int main(){
    srand(rand());
    srand(rand());
    srand(rand());
    cin>>n;
    for(int i=1;i<=n;i++) cin>>x[i]>>y[i];
    for(int i=1;i<=n;i++) order.push_back(i);
    for(int i=1;i<=1200;i++) SA();
    printf("%.2f",ans);
}
2020/8/9 12:21
加载中...