⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 auxgraph.c

📁 Dynamic Programming Code for the TSP
💻 C
字号:
#include <stdio.h>#define tofiles 1#define infinity (1<<30) /* close enough */#define masktype unsigned long int#define ones(x) ((x&1)+((x>>1)&1)+((x>>2)&1)+((x>>3)&1)+((x>>4)&1)+((x>>5)&1)+((x>>6)&1)+((x>>7)&1)+((x>>8)&1)+((x>>9)&1)+((x>>10)&1)+((x>>11)&1)+((x>>12)&1)+((x>>13)&1)+((x>>14)&1)+((x>>15)&1)+((x>>16)&1)+((x>>17)&1)+((x>>18)&1)+((x>>19)&1)+((x>>20)&1))#define highbit(x) ((x>>15)?(x>>19)?(x>>20)?20:19:(x>>17)?(x>>18)?18:17:(x>>16)?16:15:(x>>7)?(x>>11)?(x>>13)?(x>>14)?14:13:(x>>12)?12:11:(x>>9)?(x>>10)?10:9:(x>>8)?8:7:(x>>3)?(x>>5)?(x>>6)?6:5:(x>>4)?4:3:(x>>1)?(x>>2)?2:1:(x)?0:(-1))#define max1(a,b) (((a)>b)?((a)>1)?(a):1:((b)>1)?(b):1)#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)>(b)?(b):(a))#define numClasses (1<<(k-1))#define makesure(op,msg) {if((op)==0){fprintf(stderr,msg);exit(17);}}#define allocErr "Allocation Error"#define printset(x,f) for(c1=0;c1<16;c1++){if(x&(1<<c1)){printf(f,c1);}}FILE *myfile;signed char k, h, h2, which2, which, *j, *minK, *predLoc, candj, adj, *w1;unsigned long int c, c1, c2, b;unsigned long int *succs, succCount, predsCount, predsPoint, *succInx;unsigned long int *preds, *predInx, *predCount;unsigned long int SclassCount, *SclassMap;unsigned long int candSrce, candDest, candSclass, ktemp;unsigned long int    bA[20]={     0,       1,       3,     4*2,               5*4,     6*8,    7*16,    8*32,              9*64,  10*128,  11*256,  12*512,           13*1024, 14*2048, 15*4096, 16*8192,          17*16384,18*32768,19*65536,20*131072},    b2A[20]={    0,       2,       5,     6*2,               7*4,     8*8,    9*16,   10*32,             11*64,  12*128,  13*256,  14*512,           15*1024, 16*2048, 17*4096, 18*8192,          19*16384,20*32768,21*65536,22*131072},    counter[20]={0,0,     1,       3,     4*2,               5*4,     6*8,    7*16,    8*32,              9*64,  10*128,  11*256,  12*512,           13*1024, 14*2048, 15*4096, 16*8192,          17*16384,18*32768,19*65536};/* bit masks indicating membership */masktype *Sminus, *Splus, maskmaxplus, maskmaxminus, maskmaxtemp, candSminus, candSplus;signed char highPlus, highMinus;main (int argc, char *argv[]){ if (argc != 2)  { fprintf(stderr,"command needs one integer argument (>1)\n");    exit(1);  }  sscanf (argv[1],"%d",&ktemp);  k = ktemp;  b = bA[k];  if (k<2)  { fprintf(stderr,"command needs one integer argument (>1)\n");    exit(1);  }  if (k>20)  { fprintf(stderr,"Surely, you jest\n");    exit(1);  }  maskmaxminus = 1<<(k)-1;  maskmaxplus = maskmaxminus*2;  makesure(Sminus = (masktype *)calloc(b,sizeof(masktype)),allocErr);  makesure(Splus = (masktype *)calloc(b,sizeof(masktype)),allocErr);  makesure(j = (signed char *)calloc(b,sizeof(char)),allocErr);  makesure(minK = (signed char *)calloc(b,sizeof(char)),allocErr);  makesure(SclassMap = (unsigned long int *)calloc(numClasses,sizeof(long int)),allocErr);//  makesure(Sclass =(unsigned long int *)calloc(b,sizeof(long int)),allocErr);  makesure(succs = (unsigned long int *)calloc(numClasses*k,sizeof(long int)),allocErr);  makesure(succInx=(unsigned long int *)calloc(b,sizeof(long int)),allocErr);  makesure(preds = (unsigned long int *)calloc(numClasses*(k+1),sizeof(long int)),allocErr);  makesure(predInx=(unsigned long int *)calloc(b,sizeof(long int)),allocErr);  makesure(predLoc=(signed char *)calloc(b,sizeof(char)),allocErr);  makesure(predCount = (unsigned long int *)calloc(numClasses,sizeof(long int)),allocErr);  for (c=0;c<numClasses*(k+1);preds[c++]=infinity);  printf("Generating %d Nodes (%dK) ...\n",b,(b>>10)+1);//  bracket(h,k);//  h2=1;  SclassCount=succCount=0;  for (candSplus=0; candSplus<=maskmaxplus; candSplus+=2)  { maskmaxtemp = min(maskmaxminus,(1<<(k-(highPlus=highbit(candSplus))))-1);//    if (candSplus>>h2) {h2++;dotC;}    for (candSminus=0; candSminus<=maskmaxtemp; candSminus++)    { if (ones(candSplus) == ones(candSminus))      { highMinus=highbit(candSminus);        SclassMap[SclassCount]=succCount;        for (candj=1; candj<k; candj++)	{ if (candSplus&(1<<candj))	  { which = max1(highPlus+highMinus+1,candj+1);            j[counter[which]]=-candj;            Sminus[counter[which]]=candSminus;            Splus[counter[which]]=candSplus;            succs[succCount]=counter[which];            minK[counter[which]]=1+candj+highMinus;            /*Sclass[counter[which]]=SclassCount;*/            counter[which]++;            succCount++;        } }        for (candj=0; candj<k-max(0,highPlus); candj++)	{ if (!(candSminus&(1<<candj))) 	  { which2 = max1(highPlus+highMinus+1,candj+highPlus+1);            which = max1(which2,candj+1);            j[counter[which]]=candj;            Sminus[counter[which]]=candSminus;            Splus[counter[which]]=candSplus;            succs[succCount]=counter[which];            minK[counter[which]]=1+max(highMinus-candj,0);            /*Sclass[counter[which]]=SclassCount;*/            counter[which]++;            succCount++;        } }        SclassCount++;        succs[succCount]=infinity;        succCount++;  } } }  ktemp=0;//  newln;  printf("Generating Arcs...\n");  for (candSrce=0;candSrce<b;candSrce++)  { if ((candSrce & 1023) == 1023)    { fprintf(stderr,"\015%dK out of %dK nodes done",++ktemp,(b>>10)+1);    }    for (candSclass=0;candSclass<numClasses;candSclass++)    { candDest=succs[SclassMap[candSclass]];      adj=0;      if (j[candDest]!=j[candSrce]-1)      { if (j[candSrce]<0)        { if (Sminus[candSrce]&1) /* situation (a) */ 	  { adj=(((Sminus[candDest]<<1)==(Sminus[candSrce]-1)) &&                 ((Splus[candDest]>>1) ==(Splus[candSrce]-(1<<(-j[candSrce])))));	  }          else /* situation (b) */	  { adj=(((Sminus[candDest]<<1)==Sminus[candSrce]) &&                 ((Splus[candDest]>>1)==(Splus[candSrce]+1-(1<<(-j[candSrce])))));	  }        }        else if (j[candSrce]>0)        { if (Sminus[candSrce]&1) /* situation (d) */	  { adj=(((Splus[candDest]>>1)==Splus[candSrce]) &&                 ((Sminus[candDest]<<1)==(Sminus[candSrce]-1+(1<<(j[candSrce])))));	  }          else /* situation (e) */	  { adj=(((Splus[candDest]>>1)==(Splus[candSrce]+1)) &&                 ((Sminus[candDest]<<1) ==(Sminus[candSrce]+(1<<(j[candSrce])))));	  }        }        else /* situation (c) */	{ if (((Splus[candDest]>>1)==Splus[candSrce]) &&	      ((Sminus[candDest]<<1)==Sminus[candSrce])) {adj=1;}	}      }      if (adj) /* there is an arc from candSrce to candDest */      { succInx[candSrce]=candSclass;        preds[candSclass*(k+1)+predCount[candSclass]]=candSrce;        predLoc[candSrce]=predCount[candSclass];        predCount[candSclass]++;        candSclass=numClasses;      }    }  }  for (predsCount=predsPoint=c=0;c<numClasses;c++)  { for (c1=SclassMap[c];succs[c1]<infinity;c1++)    { predInx[succs[c1]]=c;    }    do    { preds[predsCount]=preds[predsPoint];      predsPoint++;      predsCount++;    }    while (preds[predsPoint-1]<infinity);    while (preds[predsPoint]==infinity && c<numClasses-1)    { predsPoint++;    }  }  fprintf(stderr,"\015All nodes done                    \n");  if (k<9 && tofiles==0)  { for (c=0;c<b;c++)    { printf("%3d: j=i%+d: minK=%d: S+={", c+1, j[c], minK[c]);      printset(Splus[c],",i-%d");      printf("}: S-={");      printset(Sminus[c],",i+%d");      printf("}\n");      printf("    outgoing arcs: (class%3d) ",succInx[c]+1);      for (c1=SclassMap[succInx[c]];succs[c1]<infinity;c1++)      { printf(",%d",succs[c1]+1);      }      printf("\n");      printf("    incoming arcs: (class%3d) ",predInx[c]+1);      for (c1=c2=0;c2<predInx[c];c2+=(preds[c1]==infinity?1:0),c1++);      for (;preds[c1]<infinity;c1++)      { printf(",%d",preds[c1]+1);      }      printf("\n");  } }  else  { printf("Writing to Files...\n");  }  cfree (Sminus);  cfree (Splus);  if ((myfile = fopen("auxgraph.lim", "w")) == NULL)  { fprintf(stderr,"error with file auxgraph.lim\n");    exit(1);  }  fprintf(myfile,"%d",k);  fclose(myfile);  if ((myfile = fopen("auxgraph.s.inx", "wb")) == NULL)  { fprintf(stderr,"error with file auxgraph.s.inx\n");    exit(1);  }  for (w1=(signed char *)succInx,c=0;c<b*4;c++,w1++){fprintf(myfile,"%c",*w1);}  fclose(myfile);  if ((myfile = fopen("auxgraph.p.inx", "wb")) == NULL)  { fprintf(stderr,"error with file auxgraph.p.inx\n");    exit(1);  }  for (w1=(signed char *)predInx,c=0;c<b*4;c++,w1++){fprintf(myfile,"%c",*w1);}  fclose (myfile);   if ((myfile = fopen("auxgraph.s.arc", "wb")) == NULL)  { fprintf(stderr,"error with file auxgraph.s.arc\n");    exit(1);  }  for (w1=(signed char *)succs,c=0;c<b2A[k]*4;c++,w1++){fprintf(myfile,"%c",*w1);}  fclose (myfile);   if ((myfile = fopen("auxgraph.p.arc", "wb")) == NULL)  { fprintf(stderr,"error with file auxgraph.p.arc\n");    exit(1);  }  for (w1=(signed char *)preds,c=0;c<b2A[k]*4;c++,w1++){fprintf(myfile,"%c",*w1);}  fclose (myfile);  if ((myfile = fopen("auxgraph.j", "wb")) == NULL)  { fprintf(stderr,"error with file auxgraph.j\n");    exit(1);  }  for (w1=j,c=0;c<b;c++,w1++){fprintf(myfile,"%c",*w1);}  fclose (myfile);  if ((myfile = fopen("auxgraph.mk", "wb")) == NULL)  { fprintf(stderr,"error with file auxgraph.mk\n");    exit(1);  }  for (w1=minK,c=0;c<b;c++,w1++){fprintf(myfile,"%c",*w1);}  fclose (myfile);  if ((myfile = fopen("auxgraph.loc", "wb")) == NULL)  { fprintf(stderr,"error with file auxgraph.loc\n");    exit(1);  }  for (w1=predLoc,c=0;c<b;c++,w1++){fprintf(myfile,"%c",*w1);}  fclose (myfile); /*  cfree(Sclass);*/  cfree(SclassMap);  cfree(succs);  cfree(succInx);  cfree(preds);  cfree(predInx);  cfree(predLoc);  cfree(predCount);  cfree(j);  cfree(minK);  for (c=1;c<k+1;c++) {printf("[%d-%d]",c,counter[c]);} printf("\nDONE\n");}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -