CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

N-queen 程序运行无结果

楼主FLYing6339(flying)2003-05-03 23:32:41 在 VC/MFC / 图形处理/算法 提问

//   Nqueen.cpp   :   Defines   the   entry   point   for   the   console   application.  
  //   Tabu   Search   for   N-queens  
  //   禁忌搜索则希望仅通过探索少数解来得到满意的优化解  
   
  #include   "stdafx.h"  
   
  #include   <stdio.h>  
  #include   <algorithm>   //me   add  
  #include   <stdlib.h>     //me   add   ;for   rand,srand  
   
  #define   TRACE   1           /*   set   =   1   to   display   information   every   iteration     */  
  #define   ZERO     0           /*   set   =   1   to   disallow   zero   moves                                     */  
  #define   FIS       0           /*   set   =   1   to   implement   first-improving   strategy       */  
  #define   MAX(X,Y)         (   (X)   >   (Y)   ?   (X)   :   (Y)   ) /*   seek   max   value   */  
   
  struct   move_info   { /*   move   info   */  
  int   i;  
  int   j;  
  int   value;  
  };  
   
   
  //////////////////FUNCTION   PROTOTYPES       /*函数原型*/  
   
   
  void   tabu_search(int   n,   int   tabu_size,   int   max_iter);  
  int   initialization(int   n,   int   *pi,   int   *d1,   int   *d2,   int   **tabu_time);  
  void   indexx(int   n,   int   *arrin,   int   *indx);  
  void   update_best(int   n,   int   *pi_best,   int   *pi_curr,   int   *c_best,   int   c_curr);  
  void   best_move(int   n,   int   iter,   int   c_best,   int   c_curr,   int   *pi,   int   *d1,int   *d2,   int   **tabu_time,   struct   move_info   *move);  
  int   evaluate(int   i,   int   j,   int   *pi,   int   *d1,   int   *d2);  
  void   execute_move(struct   move_info   move,   int   *pi,   int   *d1,   int   *d2);  
  void   print_solution(int   flag,   int   n,   int   *pi,   int   c,   int   iter);  
   
   
  /////////////Memory   Allocation   Prototypes    
   
   
  int   *ivector(int   nl,   int   nh);  
  void   free_ivector(int   *v,   int   nl);  
  int   **imatrix(int   nrl,   int   nrh,   int   ncl,   int   nch);  
  void   free_imatrix(int   **m,   int   nrl,   int   nrh,   int   ncl);  
  void   nrerror(char   *error_text);  
   
  ///////////////////MAIN   FUNCTION       /*主函数*/    
   
  void   main(int   argc,   char   **argv)  
   
  //void   main(int   argc,   char*   argv[])  
   
  {  
  int   n;                                     /*   number   of   queens                                                 */  
  int   tabu_size;                     /*   size   of   the   short   term   memory   function     */  
  int   max_iter;                       /*   maximum   number   of   iterations                         */  
  int   seed;                               /*   seed   for   random   number   generator                 */  
   
  if   (argc   !=   5)   nrerror("TSQUEEN:   <n>   <tabu_size>   <max_iter>   <seed>");  
  n   =   atoi(argv[1]);             //   将字符串argv[1]转换成整型数并返回这个数return0  
  tabu_size   =   atoi(argv[2]);  
  max_iter   =   atoi(argv[3]);  
  seed   =   atoi(argv[4]);  
  srand(seed*314);               //   变srandom   为srand  
  tabu_search(n,   tabu_size,   max_iter);  
  }  
   
   
  ///////////////////TABU   SEARCH  
   
   
  void   tabu_search(int   n,   int   tabu_size,   int   max_iter)  
   
  {  
  int   iter;                                     /*   iteration   counter                                       */  
  int   iter_best;                           /*   iteration   where   best   was   found             */  
  int   *d1;                                       /*   queens   in   negative   diagonals                 */  
  int   *d2;                                       /*   queens   in   positive   diagonals                 */  
  int   *pi_curr;                             /*   current   queen   configuration                   */  
  int   *pi_best;                             /*   best   queen   configuration                         */  
  int   c_curr;                                 /*   number   of   collisions   in   pi_curr           */  
  int   c_best;                                 /*   number   of   collisions   in   pi_best           */  
  int   **tabu_time;                       /*   tabu   structure   for   swap   moves               */  
   
  struct   move_info   move;           /*   information   related   to   best   move         */  
   
  d1   =   ivector(2,   2*n); /*   ?   i   vector   */  
  d2   =   ivector(-n+1,   n-1);  
  pi_curr   =   ivector(1,   n);  
  pi_best   =   ivector(1,   n);  
  tabu_time   =   imatrix(1,   n,   1,   n);  
   
  do   {  
  c_curr   =   initialization(n,   pi_curr,   d1,   d2,   tabu_time);  
  }   while   (c_curr   ==   0);  
  update_best(n,   pi_best,   pi_curr,   &c_best,   c_curr);  
  iter_best   =   0;  
  iter   =   0;  
  print_solution(0,   n,   pi_best,   c_best,   iter_best);  
  while   (iter   <   max_iter   &&   c_best   >   0)   {  
  ++iter;  
  best_move(n,   iter,   c_best,   c_curr,   pi_curr,   d1,   d2,tabu_time,   &move);  
  execute_move(move,   pi_curr,   d1,   d2);  
  tabu_time[move.i][move.j]   =   iter   +   tabu_size;  
  c_curr   +=   move.value;  
   
  #if   TRACE  
  printf("SWAP(%3d,   %3d)   =   %3d\n",   move.i,   move.j,   move.value);  
  #endif  
   
  if   (c_curr   <   c_best)   {  
  update_best(n,   pi_best,   pi_curr,   &c_best,   c_curr);  
  iter_best   =   iter;  
  }  
   
  #if   TRACE  
  print_solution(1,   n,   pi_curr,   c_curr,   iter);    
  #endif  
   
  }  
  print_solution(2,   n,   pi_best,   c_best,   iter_best);    
  free_ivector(d1,   2);  
  free_ivector(d2,   -n+1);  
  free_ivector(pi_curr,   1);  
  free_ivector(pi_best,   1);  
  free_imatrix(tabu_time,   1,   n,   1);  
  }  
   
  ////////////////   INITIALIZATION      
   
   
  int   initialization(int   n,   int   *pi,   int   *d1,   int   *d2,   int   **tabu_time)  
   
  {  
  int   i;                                     /*   queen   index                                                       */  
  int   *r;                                   /*   uniform   random   number                                   */  
  int   collisions;                   /*   total   number   of   collisions                         */  
   
  r   =   ivector(1,   n);  
  for   (i   =   1;   i   <=   n;   ++i)   r[i]   =   rand();   //random   ->   rand  
  indexx(n,   r,   pi);    
  for   (i   =   2;   i   <=   2*n;   ++i)   {  
  d1[i]   =   0;  
  d2[i-n-1]   =   0;  
  }  
  for   (i   =   1;   i   <=   n;   ++i)   {  
  ++d1[i+pi[i]];  
  ++d2[i-pi[i]];  
  }  
  collisions   =   0;  
  for   (i   =   2;   i   <=   2*n;   ++i)   {  
  collisions   +=   MAX(0,   d1[i]-1);  
  collisions   +=   MAX(0,   d2[i-n-1]-1);  
  }  
  free_ivector(r,   1);  
  return   collisions;  
  }/*****************************   ?   wrong***************************/  
   
   
  ////////////CONSTRUCTION   OF   AN   INDEX   TABLE  
   
   
  void   indexx(int   n,   int   *arrin,   int   *indx)  
   
  {  
  int   l,   j,   ir,   indxt,   i;  
  int   q;  
   
  for   (j   =   1;   j   <=   n;   j++)   indx[j]   =   j;  
  if   (n   ==   1)   return;  
  l   =   (n   >>   1)   +   1;  
  ir   =   n;  
  for   (;;)   {  
  if   (l   >   1)  
  q   =   arrin[(indxt   =   indx[--l])];  
  else   {  
  q   =   arrin[(indxt   =   indx[ir])];  
  indx[ir]   =   indx[1];  
  if   (--ir   ==   1)   {  
  indx[1]   =   indxt;  
  return;  
  }  
  }  
  i   =   l;  
  j   =   l   <<   1;  
  while   (j   <=   ir)   {  
  if   (   j   <   ir   &&   arrin[indx[j]]   <   arrin[indx[j+1]])   j++;  
  if   (q   <   arrin[indx[j]])   {  
  indx[i]   =   indx[j];  
  j   +=   (i   =   j);  
  }  
  else   j   =   ir   +   1;  
  }  
  indx[i]   =   indxt;  
  }  
  }  
   
  问题点数:0、回复次数:6Top

1 楼FLYing6339(flying)回复于 2003-05-03 23:33:01 得分 0

 
  //////////////UPDATE   BEST   SOLUTION    
   
   
  void   update_best(int   n,   int   *pi_best,   int   *pi_curr,   int   *c_best,   int   c_curr)  
   
  {  
  int   i;                                     /*   queen   index                                                     */  
   
  for   (i   =   1;   i   <=   n;   ++i)  
  pi_best[i]   =   pi_curr[i];  
  *c_best   =   c_curr;  
  }  
   
   
  /////////////////////BEST   MOVE    
   
   
  void   best_move(int   n,   int   iter,   int   c_best,   int   c_curr,   int   *pi,   int   *d1,int   *d2,   int   **tabu_time,   struct   move_info   *move)  
         
  {  
  int   i;                                     /*   queen   i   index                                                         */  
  int   j;                                     /*   queen   j   index                                                         */  
  int   value;                             /*   value   of   move   under   consideration                 */  
   
  move->value   =   n   +   1;  
  for   (i   =   1;   i   <=   n-1;   ++i)   {  
  for   (j   =   i+1;   j   <=   n;   ++j)   {  
  value   =   evaluate(i,   j,   pi,   d1,   d2);  
   
  #if   ZERO  
  if   (value)   {  
  #endif  
   
  if   (tabu_time[i][j]   <   iter   ||   c_curr   +   value   <   c_best)   {  
  if   (value   <   move->value)   {  
  move->value   =   value;  
  move->i   =   i;  
  move->j   =   j;  
  }  
  }  
   
  #if   ZERO  
  }  
  #endif  
   
  #if   FIS  
  if   (move->value   <   0)   break;    
  #endif  
   
  }  
   
  #if   FIS  
  if   (move->value   <   0)   break;    
  #endif  
   
  }  
  }  
   
   
  ////////////////////MOVE   EVALUATION  
   
   
  int   evaluate(int   i,   int   j,   int   *pi,   int   *d1,   int   *d2)  
   
  {  
          int   c;  
   
          c   =   MAX(0,   d1[i+pi[i]]-2)   +   MAX(0,   d2[i-pi[i]]-2)   -   d1[i+pi[i]]   -   d2[i-pi[i]]   +   2;  
          if   (i+pi[i]   !=   j+pi[j])   c   +=   MAX(0,   d1[j+pi[j]]-2)   -   d1[j+pi[j]]   +   1;  
          if   (i-pi[i]   !=   j-pi[j])   c   +=   MAX(0,   d2[j-pi[j]]-2)   -   d2[j-pi[j]]   +   1;  
          if   (i+pi[i]   ==   j+pi[j]   &&   d1[i+pi[i]]   >   2)   --c;  
          if   (i-pi[i]   ==   j-pi[j]   &&   d2[i-pi[i]]   >   2)   --c;  
          c   +=   d1[i+pi[j]]   +   d2[i-pi[j]]   -   MAX(0,   d1[i+pi[j]]-1)   -   MAX(0,   d2[i-pi[j]]-1);  
          if   (i+pi[j]   !=   j+pi[i])   c   +=   d1[j+pi[i]]   -   MAX(0,   d1[j+pi[i]]-1);  
          if   (i-pi[j]   !=   j-pi[i])   c   +=   d2[j-pi[i]]   -   MAX(0,   d2[j-pi[i]]-1);  
          if   (i+pi[j]   ==   j+pi[i]   ||   i-pi[j]   ==   j-pi[i])   ++c;  
          return   c;  
  }  
   
   
  //////////////////////EXECUTE   MOVE  
   
   
  void   execute_move(struct   move_info   move,   int   *pi,   int   *d1,   int   *d2)  
   
  {  
  int   j;                                     /*   column   index                                                           */  
   
  --d1[move.i+pi[move.i]];  
  --d2[move.i-pi[move.i]];  
  --d1[move.j+pi[move.j]];  
  --d2[move.j-pi[move.j]];  
  ++d1[move.i+pi[move.j]];  
  ++d2[move.i-pi[move.j]];  
  ++d1[move.j+pi[move.i]];  
  ++d2[move.j-pi[move.i]];  
  j   =   pi[move.j];  
  pi[move.j]   =   pi[move.i];  
  pi[move.i]   =   j;  
  }  
   
   
  ///////////////////PRINT   BEST   SOLUTION  
   
   
  void   print_solution(int   flag,   int   n,   int   *pi,   int   c,   int   iter)  
   
  {  
  int   i;                                     /*   queen   index                                                             */  
  int   j;                                     /*   column   index                                                           */  
   
  if   (flag   ==   0)   printf("\nStarting   solution:\n\n");  
  if   (flag   ==   1)   printf("\nSolution   found   at   iteration   %4d:\n\n",   iter);  
  if   (flag   ==   2)   printf("\nBest   solution   found:\n\n");  
  printf("       Number   of   collisions   =   %6d\n",   c);  
  if   (flag   ==   2)   printf("       Number   of   iterations   =   %6d\n",   iter);  
  printf("\n       ");  
  for   (j   =   1;   j   <=   n;   ++j)   printf("%3d",   j);  
  for   (i   =   1;   i   <=   n;   ++i)   {  
  printf("\n%3d",   i);  
  for   (j   =   1;   j   <=   n;   ++j)  
  if   (pi[i]   ==   j)   printf("   **");   else   printf("   __");  
  }  
  printf("\n\n");  
  }  
   
   
  ///////////////////MEMORY   ALLOCATION   FUNCTIONS  
   
   
  int   *ivector(int   nl,   int   nh)  
   
  {  
  int   *v;  
   
  v   =   (int   *)malloc((unsigned)(nh-nl+1)*sizeof(int));  
  if   (!v)   nrerror("Memory   allocation   failure   in   ivector()");  
  return   v   -   nl;  
  }  
   
  void   free_ivector(int   *v,   int   nl)  
   
  {  
  free((char*)   (v   +   nl));  
  }  
   
  int   **imatrix(int   nrl,   int   nrh,   int   ncl,   int   nch)  
   
  {  
  int   i;  
  int   **m;  
   
  m   =   (int   **)malloc((unsigned)(nrh   -   nrl   +1)*sizeof(int*));  
  if   (!m)   nrerror("allocation   failure   1   in   imatrix()");  
  m   -=   nrl;  
  for(i   =   nrl;   i   <=   nrh   ;   i++)   {  
  m[i]=   (int*)malloc((unsigned)(nch   -   ncl   +1)*sizeof(int));  
  if   (!m[i])   nrerror("allocation   failure   2   in   imatrix()");  
  m[i]   -=   ncl;  
  }  
  return   m;  
  }  
   
  void   free_imatrix(int   **m,   int   nrl,   int   nrh,   int   ncl)  
   
  {  
  int   i;  
   
  for   (i   =   nrh;   i   >=   nrl;   i--)  
  free((char*)   (m[i]   +   ncl));  
  free((char   *)(m   +   nrl));  
  }  
   
  void   nrerror(char   *error_text)  
   
  {  
  fprintf(stderr,"\n%s\n",error_text);  
  fprintf(stderr,"...   now   exiting   to   system   ...\n");  
  exit(1);  
  }  
  Top

2 楼FLYing6339(flying)回复于 2003-05-05 11:32:52 得分 0

你谁啊Top

3 楼FLYing6339(flying)回复于 2003-05-05 11:34:01 得分 0

怎没人管管??????????Top

4 楼FLYing6339(flying)回复于 2003-05-05 12:21:23 得分 0

我的这个贴子发错了地方吗?!  
   
  我想我该换个地方,对不起啦  
   
  Top

相关问题

  • 如何让一个程序只运行n次,比如说3次?
  • 运行JAVA程序
  • 程序N次正常运行后突然无法通过编译,dimm.h是什么东西?请进...
  • 编写一个程序要求实现求n*n阶矩阵的值。n在运行期间输入。怎么实现?
  • 单独运行程序
  • 程序重复运行
  • installshield运行外部程序
  • 运行memfile程序问题
  • 程序运行错误
  • 如何运行WINDOWS程序?

关键词

  • search
  • tabu
  • pi
  • move
  • curr
  • queen
  • best
  • indx
  • arrin
  • indxt

得分解答快速导航

  • 帖主:FLYing6339

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo