模拟退火50分求助
查看原帖
模拟退火50分求助
734049
__Cby___楼主2023/12/17 22:20
#include <iostream>
#include <cmath>
#include <random>
#include <ctime>
using namespace std;
mt19937 myrand(time(0));
int a[35];
int n;
long long int bst=0;
int energy(){
	long long int q=n/2;
	long long int qs=0;
	for(int i=1;i<=q;i++){
		qs+=a[i];
	}
	long long int bs=0;
	for(int i=q+1;i<=n;i++){
		bs+=a[i];
	}
	return abs(qs-bs);
}
int SA(){
	double t=3000;
	while(t>1e-15){
		int x=myrand()%n+1;
		int y=myrand()%n+1;
		swap(a[x],a[y]);
		int nw=energy();
		if(nw<bst){
			bst=nw;
		}
		else if(exp(-(nw-bst)/t)>myrand()){
			swap(a[x],a[y]);
		}
		t*=0.97;
	}
	return 0;
}
int main(){
	int T;
	cin>>T;
	while(T--){
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		bst=energy();
		for(int i=1;i<=800;i++){
			SA();
		}
		cout<<bst<<endl;
	}
	return 0;
}
2023/12/17 22:20
加载中...