Tranvick

simulated_annealing_queens

Apr 7th, 2012
570
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.33 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cmath>
  3. #include <ctime>
  4. #include <cstdio>
  5. #include <memory.h>
  6. #define memo(A) memset(A,0,sizeof(A))
  7. #define rep(I,B) for (int I=0;I<(B);I++)
  8. #define N 1111
  9.  
  10. using namespace std;
  11.  
  12.  
  13. int n,a[N],g[N],ba[N],ans,dsum[N],ddif[N];
  14.  
  15. inline double get_rand(){
  16.     return ((rand()*1ll*rand()*rand())%1000000001)/1000000000.0;
  17. }
  18.  
  19. inline void get_next(int k) {
  20.     int p[N],r[N];
  21.     rep(i,n) p[i]=r[i]=i;
  22.     rep(i,k) swap(p[i],p[n-1-rand()%(n-i)]);
  23.     for (int i=k-1;i>0;i--) swap(r[i],r[rand()%(i+1)]);
  24.     rep(i,n) g[i]=a[i];
  25.     rep(i,k) g[p[i]]=a[p[r[i]]];
  26. }
  27.  
  28. inline int eval(){
  29.     int res=0;
  30.     memo(dsum);memo(ddif);
  31.     rep(i,n){
  32.         res+=dsum[i+g[i]];
  33.         ++dsum[i+g[i]];
  34.         res+=ddif[i-g[i]+n];
  35.         ++ddif[i-g[i]+n];
  36.     }
  37.     return res;
  38. }
  39.  
  40. inline double prob(int cur,int nw,double t){
  41.     int delta=nw-cur;
  42.     if (delta<0) return 1.0;
  43.     else return exp(-delta/t);
  44. }
  45.  
  46. int main(){
  47.     srand(time(NULL));
  48.     scanf("%d",&n);
  49.     int cure;
  50.     rep(i,n) g[i]=i;
  51.     random_shuffle(g,g+n);
  52.     rep(i,n) a[i]=ba[i]=g[i];
  53.     cure=ans=eval();
  54.     double mxt=20.0;
  55.     for (double t=mxt;ans;t*=0.98){
  56.         int k=max(2,(int)(t/mxt*n));
  57.         get_next(k);
  58.         int ne=eval();
  59.         if (prob(cure,ne,t)>=get_rand()){
  60.             cure=ne;
  61.             rep(i,n) a[i]=g[i];
  62.         }
  63.         if (cure<ans){
  64.             ans=cure;
  65.             rep(i,n) ba[i]=a[i];
  66.         }
  67.     }
  68.     rep(i,n) printf("%d ",ba[i]+1);
  69.     return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment