退火求调参70pts
查看原帖
退火求调参70pts
1368930
chenzhexuan1楼主2025/8/5 10:24
#include <iostream>
#include <cmath>
#include <ctime>
#include <climits>
#define int long long
#define lowbit(x)((x)&-(x))
#define START (double)(1e3)
#define END (double)(1e-17)
#define DECAY 0.975
#define SHIFT_MAX 32767
using namespace std;

int n,p[100005],w[100005],l,seed,min_sum=LLONG_MAX;

inline int xorshift(){
    seed^=seed<<13;
    seed^=seed>>17;
    seed^=seed<<5;
    return(seed&0x7fff);
}

inline long long calc(int x){
    long long sum=0;
    for(int i=1;i<=n;i++)sum+=abs(x-p[i])*w[i];
    if(sum<min_sum)min_sum=sum;
    return sum;
}

inline void SA(){
    int current_ans=p[n/2],current_val=calc(current_ans);
    for(double t=START;t>=END;t*=DECAY){
        int r=max(1.0,t/10);
        int step=(xorshift()%(2*r+1))-r;
        int new_x=current_ans+step;        
        new_x=max(0LL,min(new_x,l));
        int new_val=calc(new_x),delta=new_val-current_val;
        if(delta<0||(exp(-delta/t)*SHIFT_MAX>xorshift())){
            current_ans=new_x;
            current_val=new_val;
        }
    }
}

signed main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>l>>n;
    seed=time(0)^0xDEADBEEF;
    for(int i=1;i<=n;i++)cin>>p[i]>>w[i];
    for(int i=1;i<=3;i++)SA();
    cout<<min_sum<<endl;
    return 0;
}

我的评测记录。。。最吉利的编号(8880888),最差的退火

2025/8/5 10:24
加载中...