模拟退火91分求助
查看原帖
模拟退火91分求助
717599
dengjunhaodejia09楼主2023/1/11 11:27
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<cmath>
using namespace std;
int a[1001][1001],ans=2147483647;
int b[1001][1001];
int c[1001];
int d[1001];
int n;
int jsuan(){
	long long sum=0;
	for(int i=1;i<=n;i++){
		sum+=(a[c[i]][d[i]]*b[d[i]][c[i]]);
	}
	return sum;
}
void mon(){
	
	double At=20000,Dt=0.99,Bt=1e-10;
	for(register double T=At; T>Bt; T*=Dt) {
		int x=rand()%n+1,y=rand()%n+1;
		int z=rand()%n+1,k=rand()%n+1;
		swap(c[x],c[y]);
		swap(d[z],d[k]);
		int sum=jsuan();
		if(sum>ans) ans=sum;
		else if(exp((ans-sum)/T)<(double(rand())/RAND_MAX))
			swap(a[x],a[y]);
	}
}
int main() {
	srand(time(0));
	
	
		
		cin>>n;
		for(int i=1;i<=n;i++){
			d[i]=i;
			for(int j=1;j<=n;j++)
				cin>>a[i][j];
		}
		for(int i=1;i<=n;i++){
			c[i]=i;
			for(int j=1;j<=n;j++)
				cin>>b[i][j];
		}
		ans=0;
		for(int i=1;i<=4700;i++){
			mon();
		}
		cout<<ans<<endl;
	
}
2023/1/11 11:27
加载中...